2010-11-30 18 views
5

¿Cuál será el estado de un puntero a objeto cuando un nuevo constructor de clase arroje una excepción en C++? Tome el siguiente código de ejemplo:Estado del puntero a objeto después de que el nuevo constructor arroje una excepción - C++

CMyClass * pobjMyClass = (CMyClass *)0xA5A5A5A5; 

try 
{ 
    pobjMyClass = new CMyClass(); // Exception thrown in constructor 
} 
catch (...) {} 

Cuando este código se ejecuta lo que será el valor de pobjMyClass ser, después se produce la excepción? Un puntero a una instancia no válida de CMyClass, 0xA5A5A5A5, NULL, algún valor aleatorio no inicializado o algo más? Gracias.

+0

Seguramente has probado esto? – TonyK

+2

@TonyK, probar cosas solo proporciona la mitad de la respuesta: cómo funciona en * su * compilador. A menudo es útil saber cómo funciona universalmente. C++ está lleno de trampas, y es bueno ser precavido. –

+0

Aun así, Mark - ¿seguro que Jim lo ha probado? ¿Que pasó? – TonyK

Respuesta

6

Dado que se lanza la excepción antes de que se lleve a cabo la asignación, pobjMyClass será lo que era antes - en su caso, 0xa5a5a5a5.

+0

+1 eliminando el mío porque en realidad obtuviste la respuesta correcta primero :) –

+0

Bueno, técnicamente fue un poco estúpido de mi parte publicar una nueva respuesta a pesar de que la tuya fue comentada en comentarios y perfectamente bien después de la edición. Pero gracias :) – EboMike

+4

Para ser más exactos, hay un punto de secuencia a la salida del constructor, lo que significa que el efecto secundario de la asignación no puede ocurrir antes de que el constructor regrese. Como el constructor no regresa, la asignación nunca ocurre. – aschepler

Cuestiones relacionadas