2010-09-09 12 views
23

Conozco las diferencias entre los dos. Una cosa notable es que abort() envía señal SIGABRT, por lo que puede ser relevante cuando su software confía en ellos. Pero para una aplicación típica, exit() parece ser una versión más segura de abort() ...? ¿Hay alguna otra preocupación para usar abort() en lugar de exit()?Cuando abort() es preferible a exit()?

Respuesta

31

Al usar abort se volcará el núcleo, si el usuario tiene habilitados los volcados centrales. Así que, como regla general, usaría abort si no está seguro de lo que salió mal y la única forma de obtener información útil es mediante el análisis de un volcado del núcleo.

Si puede con seguridad exit desde cualquier punto dado, y no necesita el volcado del núcleo, entonces la salida es un enfoque más agradable.

+1

que también es un buen punto +1 – doc

+2

Lo expresaría de otra manera: ¿esperas que tus usuarios analicen los volcados del núcleo? Si no, no use abortar. (Teniendo en cuenta que aunque el desarrollador desee un volcado de memoria, puede que sus usuarios no lo hagan. Por lo tanto, tal vez solo deba usarse en una versión de "depuración" de su ejecutable). –

+0

@Ken Simon: Si los usuarios no quieren core vuelcos, pueden apagarlos (ulimit -c 0). Creo que Ubuntu lo hace por defecto. – camh

8

A veces su programa se rompe en tal medida que su estado se vuelve inconsistente y por lo tanto exit() no funcionará porque causaría la destrucción de objetos globales y este último no funcionaría correctamente cuando el estado es inconsistente. En tales situaciones, se prefiere abort().

+1

Supongo que es por ejemplo cuando IO deja de funcionar debido a una falla de disco duro. Capturas esto como una excepción pero no puedes destruir objetos de archivo porque sus destructores necesitan realizar un cierre de archivo. Gracias por la idea – doc

+2

@doc: Sí, pero es un ejemplo bastante extremo. Un ejemplo más de C++: ya está manejando un error y ocurre otro error (no relacionado con el proceso de manejo de errores) y el código de manejo vuelve a entrar. Eso no es muy bueno: los errores suceden más rápido que usted puede manejarlos. Así que mantienes una bandera "Ya estoy dentro manejando este tipo de error". Una vez que vuelva a ingresar el código, tire la toalla: llame a 'abort()' para finalizar el programa inmediatamente. – sharptooth

+1

Cuál es por qué usted no 'tira' de destructores. Si se llama al destructor durante el desenrollado de la pila causado por una excepción, se llama a 'abort()'. –

19

Utilice abort() si su programa está en un estado posiblemente corrupto y considera que es demasiado peligroso tratar de hacer algo más. exit() provocará que se llamen las funciones atexit y en los destructores C++ de objetos estáticos. Esto es generalmente lo que quiere para una salida limpia, pero podría ser catastrófico si, por ejemplo, sobrescriben un archivo con datos corruptos.

+3

+1: pero también tienes otras maneras de hacerlo. para no llamar a la función registrada como atexit, también puede _exit() en lugar de exit(), o incluso enviar un SIGKILL a usted mismo para la salida inmediata. – kriss

+0

@Kriss: 'abort()' es la forma estándar de hacerlo, y fácil. ¿Por qué elegirías un método no estándar? – MSalters

+0

@kriss: '_exit()' no es C o C++ estándar, y abortar levantando una señal que no sea 'SIGABRT' parece un poco extraño. –

1

Se prefiere abortar cuando la aplicación no puede manejar la excepción y no puede entender qué hacer. La aplicación de salida Exit() debe completar todas las tareas correctamente. si se produce una excepción y la aplicación puede manejar el mismo, entonces se produce la llamada a Exit().

Cuestiones relacionadas