abortar indica un final "anormal" del programa, y genera la señal POSIX SIGABRT, lo que significa que se invocará cualquier controlador que haya registrado para esa señal, aunque el programa terminará después de las palabras en ambos casos. Por lo general, lo usaría aborten un programa C para salir de un caso de error inesperado donde es probable que el error sea un error en el programa, en lugar de algo como una entrada incorrecta o una falla de la red. Por ejemplo, podría aborthacerlo si se descubriese que una estructura de datos tiene un puntero NULL cuando, lógicamente, eso nunca debería suceder.
exit indica un final "normal" del programa, aunque esto aún puede indicar una falla (pero no un error). En otras palabras, exitpodría aparecer un código de error si el usuario proporcionó una entrada que no se pudo analizar o un archivo no se pudo leer. Un código de salida de 0 indica éxito. exittambién, opcionalmente, llama a los controladores antes de que finalice el programa. Estos están registrados con las funciones atexity on_exit.
std :: terminate es lo que se llama automáticamente en un programa C ++ cuando hay una excepción no controlada. Este es esencialmente el equivalente de C ++ abort, asumiendo que está informando todos sus errores excepcionales mediante la publicación de excepciones. Esto llama a un controlador establecido por la std::set_terminatefunción, que de forma predeterminada simplemente llama abort.
En C ++, generalmente desea evitar llamadas aborto exiterrores, ya que es mejor lanzar una excepción y dejar que el código más arriba en la pila de llamadas decida si finalizar el programa es apropiado o no. Si lo usa o no exitpara el éxito es una cuestión de circunstancias, si tiene sentido o no finalizar el programa en otro lugar que no sea la declaración de retorno en main.
std::terminatedebe considerarse una herramienta de informe de errores de última hora, incluso en C ++. El problema std::terminatees que el controlador de terminación no tiene acceso a la excepción que no se controló, por lo que no hay forma de saber qué fue. Por lo general, es mucho mejor envolver la totalidad de main en un try { } catch (std::exception& ex) { }bloque. Al menos entonces puede reportar más información sobre las excepciones derivadas de std::exception(aunque, por supuesto, las excepciones que no derivan de ellas std::exceptionterminarían sin ser manejadas).
Envolver el cuerpo de mainin try { } catch(...) { }no es mucho mejor que configurar un controlador de terminación, porque nuevamente no tiene acceso a la excepción en cuestión. Editar: según la respuesta de Neil Butterworth, hay un beneficio en que la pila se desenrolla en este caso, lo que (algo sorprendentemente) no es cierto para una excepción no manejada.