Em C e C ++, qual é a diferença entre exit()
e abort()
? Estou tentando finalizar meu programa após um erro (não uma exceção).
abort()
sai do seu programa sem chamar funções registradas usando atexit()
primeiro e sem chamar primeiro os destruidores de objetos. exit()
faz as duas coisas antes de sair do seu programa. Porém, ele não chama destruidores para objetos automáticos. assim
A a;
void test() {
static A b;
A c;
exit(0);
}
Destruirá a
e b
corretamente, mas não chamará destruidores de c
. abort()
não chamaria destruidores de nenhum dos objetos. Como isso é lamentável, o Padrão C ++ descreve um mecanismo alternativo que garante a finalização adequada:
Objetos com duração de armazenamento automático são todos destruídos em um programa cuja função
main()
não contém objetos automáticos e executa a chamada paraexit()
. O controle pode ser transferido diretamente para issomain()
, lançando uma exceção capturadamain()
.
struct exit_exception {
int c;
exit_exception(int c):c(c) { }
};
int main() {
try {
// put all code in here
} catch(exit_exception& e) {
exit(e.c);
}
}
Em vez de ligar exit()
, organize esse código throw exit_exception(exit_code);
.
abort envia um sinal SIGABRT, sair apenas fecha o aplicativo executando a limpeza normal.
Você pode manipular um sinal de aborto como desejar, mas o comportamento padrão é fechar o aplicativo também com um código de erro.
abort não executará a destruição de objetos de seus membros estáticos e globais, mas a saída o fará.
Obviamente, quando o aplicativo estiver completamente fechado, o sistema operacional liberará qualquer memória não liberada e outros recursos.
Tanto no cancelamento quanto no encerramento do programa de saída (assumindo que você não substituiu o comportamento padrão), o código de retorno será retornado ao processo pai que iniciou seu aplicativo.
Veja o seguinte exemplo:
Comentários:
Se o cancelamento for descomentado: nada será impresso e o destruidor de algum objeto não será chamado.
Se abortar for comentado como acima: someobject destructor será chamado, você obterá a seguinte saída:
fonte
O seguinte acontece quando um programa chama
exit
():atexit
função são executadastmpfile
são removidosA
abort
função () envia oSIGABRT
sinal para o processo atual; se não for capturado, o programa será encerrado sem garantia de que os fluxos abertos sejam liberados / fechados ou que os arquivos temporários criados viatmpfile
sejam removidos,atexit
as funções registradas não sejam chamadas e uma função não- o status de saída zero é retornado ao host.fonte
Na página do manual exit ():
Na página do manual abort ():
fonte
abort
envia oSIGABRT
sinal.abort
não retorna ao chamador. O manipulador padrão para oSIGABRT
sinal fecha o aplicativo.stdio
os fluxos de arquivos são liberados e depois fechados. Destruidores para instâncias de classe C ++ não são, no entanto (não tenho certeza disso - talvez os resultados sejam indefinidos?).exit
possui seus próprios retornos de chamada, definidos comatexit
. Se retornos de chamada forem especificados (ou apenas um), eles serão chamados na ordem inversa de sua ordem de registro (como uma pilha), e o programa será encerrado. Como comabort
,exit
não retorna ao chamador.stdio
os fluxos de arquivos são liberados e depois fechados. Além disso, os destruidores para instâncias de classe C ++ são chamados.fonte