En C et C ++, quelle est la différence entre exit()
et abort()
? J'essaye de terminer mon programme après une erreur (pas une exception).
abort()
quitte votre programme sans appeler les fonctions enregistrées en utilisant d' atexit()
abord, et sans appeler d'abord les destructeurs d'objets. exit()
fait les deux avant de quitter votre programme. Cependant, il n'appelle pas de destructeurs pour les objets automatiques. Alors
A a;
void test() {
static A b;
A c;
exit(0);
}
Détruira a
et b
correctement, mais n'appellera pas les destructeurs de c
. abort()
n'appellerait pas les destructeurs de l'un ou l'autre des objets. Comme cela est malheureux, la norme C ++ décrit un mécanisme alternatif qui garantit une terminaison correcte:
Les objets avec une durée de stockage automatique sont tous détruits dans un programme dont la fonction
main()
ne contient aucun objet automatique et exécute l'appel àexit()
. Le contrôle peut être transféré directement à un telmain()
en lançant une exception interceptéemain()
.
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);
}
}
Au lieu d'appeler exit()
, organisez ce code à la throw exit_exception(exit_code);
place.
abort envoie un signal SIGABRT, exit ferme simplement l'application effectuant un nettoyage normal.
Vous pouvez gérer un signal d' abandon comme vous le souhaitez, mais le comportement par défaut consiste également à fermer l'application avec un code d'erreur.
abort n'effectuera pas la destruction d'objets de vos membres statiques et globaux, mais exit le fera.
Bien sûr, lorsque l'application est complètement fermée, le système d'exploitation libère toute mémoire non libérée et d'autres ressources.
À la fois lors de l'arrêt du programme d' abandon et de sortie (en supposant que vous n'ayez pas remplacé le comportement par défaut), le code de retour sera renvoyé au processus parent qui a démarré votre application.
Consultez l'exemple suivant:
Commentaires:
Si abort est décommentée: rien est imprimé et le destructeur de SomeObject ne sera pas appelé.
Si abandonner est commenté comme ci-dessus: un destructeur d'objet sera appelé, vous obtiendrez la sortie suivante:
la source
Les choses suivantes se produisent lorsqu'un programme appelle
exit
():atexit
fonction sont exécutéestmpfile
sont supprimésLa
abort
fonction () envoie leSIGABRT
signal au processus en cours, s'il n'est pas intercepté, le programme se termine sans aucune garantie que les flux ouverts sont vidés / fermés ou que les fichiers temporaires créés viatmpfile
sont supprimés,atexit
les fonctions enregistrées ne sont pas appelées et un non- l'état de sortie zéro est renvoyé à l'hôte.la source
Depuis la page de manuel exit ():
Depuis la page de manuel abort ():
la source
abort
envoie leSIGABRT
signal.abort
ne revient pas à l'appelant. Le gestionnaire par défaut duSIGABRT
signal ferme l'application.stdio
les flux de fichiers sont vidés, puis fermés. Cependant, les destructeurs pour les instances de classe C ++ ne le sont pas (pas sûr sur celui-ci - peut-être que les résultats ne sont pas définis?).exit
a ses propres rappels, définis avecatexit
. Si des callbacks sont spécifiés (ou un seul), ils sont appelés dans l'ordre inverse de leur ordre d'enregistrement (comme une pile), puis le programme se termine. Comme avecabort
,exit
ne revient pas à l'appelant.stdio
les flux de fichiers sont vidés, puis fermés. En outre, les destructeurs pour les instances de classe C ++ sont appelés.la source