Está bien especificado el comportamiento de datos no inicializados?

Nota Estoy usando el compilador de g ++ (que es bastante bueno y se supone que está bastante cerca del estándar).

Tengo la clase más simple que se me ocurre:

class BaseClass  {
  public:
    int pub;
};

Entonces tengo tres programas igualmente simples para crearBaseClass objeto (s) e imprima el valor [no inicializado] de sus datos.

Caso
BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;

Esto imprime:

B1.pub = 1629556548

Lo cual está bien. De hecho, pensé que se inicializaría a cero porque es un POD o Plain Old Datatype o algo así, pero supongo que no. Hasta aquí todo bien

Case 2
BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;
BaseClass B2;
cout<<"B2.pub = "<<B2.pub<<endl;

Esto imprime:

B1.pub = 1629556548
B2.pub = 0

Esto es definitivamente extraño. Creé dos de los mismos objetos de la misma manera. Uno se inicializó y el otro no.

Case 3
BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;
BaseClass B2;
cout<<"B2.pub = "<<B2.pub<<endl;
BaseClass* pB3 = new BaseClass;
cout<<"B3.pub = "<<pB3->pub<<endl;

Esto imprime:

B1.pub = 0
B2.pub = 0
B3.pub = 0

Esto es lo más raro hasta ahora. Todos se inicializan a cero. Todo lo que hice fue agregar dos líneas de código y cambió el comportamiento anterior.

Entonces esto es solo un caso de 'datos no inicializados que conducen a un comportamiento no especificado' o hay algo más lógico 'debajo del capó'?

Realmente quiero entender el comportamiento predeterminado del constructor / destructor porque tengo la sensación de que será muy importante para comprender completamente las cosas de la herencia ..

Respuestas a la pregunta(7)

Su respuesta a la pregunta