2011-08-14 5 views
16

Duplicar posibles:
Will exit() or an exception prevent an end-of-scope destructor from being called?¿Se ejecutan los destructores al llamar a exit()?

En C++, cuando la aplicación llama a la salida (3) son los destructores de la pila supone que ejecutar para desenrollar la pila?

+0

Y, ¿hay un enfoque alternativo? 'throw' un tipo especial en lugar de llamar a' exit', atraparlo en 'main', y luego' return' from 'main' en lugar de' exit' from 'main'? –

+1

@ AaronMcDaid No entiendo tu pregunta. Enfoque alternativo a qué? ¿Qué intentaría lograr evitando una llamada a 'exit()'? En una de mis aplicaciones, tiro un objeto 'customExit' y lo cojo en main y uso un valor entero del objeto' customExit' para proporcionar el valor de retorno desde main, de esta forma mis destructores RAII se ejecutan para limpiar cosas como archivos temporales. – WilliamKF

+0

tu comentario respondió mi pregunta (mal escrita) exactamente. ¡Gracias! Básicamente, quería la confirmación de que otras personas usan este enfoque 'throw' para asegurar que todo se destruya en un programa normal exit –

Respuesta

28

No, la mayoría de los destructores no se ejecutan en exit().

C++ 98 §18.3/8 discute esto.

Básicamente, cuando se llama exit se destruyen los objetos estáticos, se ejecutan los controladores atexit, los flujos C abiertos se lavan y se cierran, y los archivos creados por tmpfile se eliminan. Los objetos automáticos locales no se destruyen. Es decir, sin desenrollar la pila.

Llamar a abort deja que suceda aún menos: sin ninguna limpieza.

+0

Para las personas que no quieren que suceda ninguna limpieza, _exit() podría ser una mejor opción que abort(), ya que el aborto elevará la señal SIGABRT, lo que generalmente da como resultado un comportamiento bastante similar a un bloqueo. –

5

Si su sistema operativo es razonable (Unix, Linux o un Windows reciente), al llamar a exit() se le indica al kernel que desasigne la memoria de todos los procesos. La pila no necesita ser desenrollada; simplemente dejará de existir.

+13

Y no se invocará ningún código RAII en los destructores de la pila. Lo cual puede no importar si se trata solo de memoria privada para el proceso; pero que importa si se trata de (a) archivos que necesitan ser eliminados o renombrados, o de otra forma limpiados, y (b) la integridad de las estructuras de datos compartidas entre procesos en la memoria compartida. // Por razones como estas, algunos proyectos han prohibido el uso de exit, y/o han redefinido exit() para lanzar una excepción que provocará el desenrollado de la pila. –

Cuestiones relacionadas