2010-04-19 15 views
17

Digamos que tengo el siguiente código:¿Saldrá() o una excepción evitará que se llame a un destructor de fin de ámbito?

struct mytype 
{ 
    ~mytype() { /* do something like call Mix_CloseAudio etc */ } 
}; 

int main() 
{ 
    mytype instant; 

    init_stuff(); 

    start(); 

    return 0; 
} 

Es eso destructor garantizada para ser llamado incluso si la salida() se utiliza desde algún lugar en el interior de inicio()?

+2

excepciones llamarán al destructor, 'exit()' no lo hará. – falstro

+0

No es exactamente este caso pero recibí destructores llamados por * objetos estáticos * en Linux con GCC. –

Respuesta

21

Si llama al exit, no se llamará al destructor.

Desde el C++ estándar (§3.6.1/4):

Llamar a la función

void exit(int); 

declarada en <cstdlib> (18.3) termina el programa sin salir de la actual bloquear y, por lo tanto, sin destruir ningún objeto con duración de almacenamiento automático (12.4). Si se llama a exit para finalizar un programa durante la destrucción de un objeto con duración de almacenamiento estático, el programa tiene un comportamiento indefinido.

16

Sí, llamando a exit() significa el destructor no se llamará:

Llamar a la función void exit (int); declarada en <cstdlib> (18.3) finaliza el programa sin dejar el bloque actual y, por lo tanto, sin destruyendo los objetos con la duración de almacenamiento automática (12.4). Si la salida es llamada para finalizar un programa durante la destrucción de un objeto con una duración de almacenamiento estática , el programa tiene comportamiento indefinido.

Si se produce una excepción, por otro lado, se llamará al destructor. Esta es la base de la seguridad de excepción en C++.

3

Las excepciones invocarán destructores, siempre que algo en el programa capte la excepción. Si la excepción sale de la función main() sin ser capturada, la norma no requiere que el tiempo de ejecución desenrolle la pila para su limpieza.

El uso de un

try{ 
    // code 
}catch(...){ //that elipsis should actually appear in your code 
      //it doesn't mean I omitted code here. 
    //code 
} 

en su función main() garantizará que cada excepción se detecta, y todos los destructores son llamados.

Cuestiones relacionadas