c++ - ¿Exigirá exit() o una excepción para evitar que se llame a un destructor de fin de alcance?
(3)
Digamos que tengo el siguiente código:
struct mytype
{
~mytype() { /* do something like call Mix_CloseAudio etc */ }
};
int main()
{
mytype instant;
init_stuff();
start();
return 0;
}
¿Se garantiza que se llame a ese destructor incluso si se usa exit () desde algún lugar dentro de start ()?
Las excepciones llamarán a los destructores, siempre que algo en el programa detecte la excepción. Si la excepción sale de la función main () sin ser detectada, el estándar no requiere que el tiempo de ejecución desenrolle la pila para limpiar.
Usando 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 se detecten todas las excepciones y que se llame a todos los destructores.
Sí, llamar a exit () significa que no se llamará al destructor:
Llamando a la función void exit (int); declarado en
<cstdlib>
(18.3) finaliza el programa sin abandonar el bloque actual 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 una duración de almacenamiento estática, el programa tiene un comportamiento indefinido.
Si se lanza una excepción, por otro lado, se llamará al destructor. Esta es la base de la excepción de seguridad en C ++.
Si llama a exit
, no se llamará al destructor.
Del estándar C ++ (§3.6.1 / 4):
Llamando a la función
void exit(int);
declarado en
<cstdlib>
(18.3) finaliza el programa sin abandonar el bloque actual 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 una duración de almacenamiento estática, el programa tiene un comportamiento indefinido.