Código debe explicar cosas:C++: puntero de miembro inicializado? muestra
class A
{
B* pB;
C* pC;
D d;
public :
A(int i, int j) : d(j)
{
pC = new C(i, "abc");
} // note pB is not initialised, e.g. pB(NULL)
...
};
Obviamente pB debe ser inicializado a NULL explícita para ser seguro (y claro), pero, tal y como está, cuál es el valor de Pb después de la construcción de A? ¿Está inicializado por defecto (que es cero?) O no (es decir, indeterminado y lo que haya en la memoria). Me doy cuenta de que la inicialización en C++ tiene unas pocas reglas justas.
Creo que no se ha inicializado por defecto; como se ejecuta en modo de depuración en Visual Studio, ha establecido pB apuntando a 0xcdcdcdcd, lo que significa que la memoria ha sido new'd (en el montón) pero no se ha inicializado. Sin embargo, en el modo de lanzamiento, pB siempre apunta a NULL. ¿Es esto solo por casualidad y, por lo tanto, no se puede confiar en él? o estos compiladores lo inicializan para mí (incluso si no está en el estándar)? También parece ser NULL cuando se compila con el compilador de Sun en Solaris.
Realmente estoy buscando una referencia específica a la norma para decir de una forma u otra.
Gracias.
Indeterminado (y algunos compiladores advertirán), pero no tengo el C++ estándar a mano ... – ephemient
B es un puntero al azar en la naturaleza. Nota. En el modo de depuración, la mayoría del compilador lo inicializará en NULL (supuestamente para ayudar en la depuración). Pero en el modo de lanzamiento tendrá el valor que estaba previamente en la memoria. –