std::exit
Von cppreference.com
| Definiert in Header <cstdlib> |
||
void exit( int exit_code ); |
(bis C++11) | |
| [[noreturn]] void exit( int exit_code ); |
(seit C++11) | |
Veranlasst die normale Beendigung des Programms.
Mehrere Bereinigungsschritte werden ausgeführt
|
1) Objekte mit statischer Speicherdauer werden zerstört und Funktionen, die durch Aufruf von std::atexit registriert wurden, werden aufgerufen
a) Nicht-lokale Objekte mit statischer Speicherdauer werden in umgekehrter Reihenfolge der Fertigstellung ihres Konstruktors zerstört.
b) Mit std::atexit registrierte Funktionen werden in umgekehrter Reihenfolge ihrer Registrierung aufgerufen, außer dass eine Funktion nach zuvor registrierten Funktionen aufgerufen wird, die zu dem Zeitpunkt, als sie registriert wurde, bereits aufgerufen worden waren.
c) Für jede Funktion f, die mit std::atexit registriert wurde, und jedes nicht-lokale Objekt obj mit statischer Speicherdauer,
d) Für jedes lokale Objekt obj mit statischer Speicherdauer wird obj so zerstört, als ob eine Funktion, die den Destruktor von obj aufruft, bei std::atexit am Ende des Konstruktors von obj registriert worden wäre. |
(bis C++11) |
|
1) Die Destruktoren von Objekten mit thread-lokaler Speicherdauer, die mit dem aktuellen Thread assoziiert sind, die Destruktoren von Objekten mit statischer Speicherdauer und die mit std::atexit registrierten Funktionen werden gleichzeitig ausgeführt, wobei die folgenden Garantien aufrechterhalten werden
a) Der letzte Destruktor für thread-lokale Objekte wird vor dem ersten Destruktor für ein statisches Objekt ausgeführt.
b) Wenn die Fertigstellung des Konstruktors oder der dynamischen Initialisierung für ein thread-lokales oder statisches Objekt A vor dem thread-lokalen oder statischen Objekt B erfolgte, erfolgt die Fertigstellung der Zerstörung von B vor dem Beginn der Zerstörung von A.
c) Wenn die Fertigstellung der Initialisierung eines statischen Objekts A vor dem Aufruf von std::atexit für eine Funktion F erfolgte, erfolgt der Aufruf von F während der Beendigung vor dem Beginn der Zerstörung von A.
d) Wenn der Aufruf von std::atexit für eine Funktion F vor der Fertigstellung der Initialisierung eines statischen Objekts A erfolgte, erfolgt der Beginn der Zerstörung von A vor dem Aufruf von F während der Beendigung.
e) Wenn der Aufruf von std::atexit für eine Funktion F1 vor dem Aufruf von std::atexit für eine Funktion F2 erfolgte, dann erfolgt der Aufruf von F2 während der Beendigung vor dem Aufruf von F1. |
(seit C++11) |
- Im oben genannten Kontext,
- Wenn eine mit
atexitregistrierte Funktion oder ein Destruktor eines statischen/thread-lokalen Objekts eine Ausnahme wirft, wird std::terminate aufgerufen. - Wenn der Compiler die dynamische Initialisierung eines Objekts in die statische Initialisierungsphase der nicht-lokalen Initialisierung verschoben hat, respektiert die Reihenfolge der Zerstörung seine beabsichtigte dynamische Initialisierung.
- Wenn ein lokales statisches Objekt (im Block-Gültigkeitsbereich) zerstört wurde und diese Funktion dann aus dem Destruktor eines anderen statischen Objekts aufgerufen wird und der Kontrollfluss durch die Definition dieses Objekts verläuft (oder wenn es indirekt über einen Zeiger oder eine Referenz verwendet wird), ist das Verhalten undefiniert.
- Wenn ein lokales statisches Objekt (im Block-Gültigkeitsbereich) während der Konstruktion eines Subobjekts einer Klasse oder eines Arrays initialisiert wurde, wird es erst zerstört, nachdem alle Subobjekte dieser Klasse oder alle Elemente dieses Arrays zerstört wurden.
- Wenn eine mit
2) Alle C-Streams werden gespült und geschlossen.
3) Mit std::tmpfile erstellte Dateien werden entfernt.
4) Die Kontrolle wird an die Host-Umgebung zurückgegeben. Wenn
exit_code 0 oder EXIT_SUCCESS ist, wird ein implementierungsdefinierter Status zurückgegeben, der eine erfolgreiche Beendigung anzeigt. Wenn exit_code EXIT_FAILURE ist, wird ein implementierungsdefinierter Status zurückgegeben, der eine erfolglose Beendigung anzeigt. In anderen Fällen wird ein implementierungsdefinierter Statuswert zurückgegeben.Der Stack wird nicht entrollt: Destruktoren von Variablen mit automatischer Speicherdauer werden nicht aufgerufen.
Inhalt |
[bearbeiten] Beziehung zur main-Funktion
Die Rückkehr aus der main-Funktion, entweder durch eine return-Anweisung oder durch Erreichen des Funktionsendes, führt die normale Funktionsbeendigung aus (ruft die Destruktoren der Variablen mit automatischer Speicherdauer auf) und führt dann std::exit aus, wobei das Argument der return-Anweisung (oder 0 bei impliziter Rückgabe) als exit_code übergeben wird.
[bearbeiten] Parameter
| exit_code | - | Beendigungsstatus des Programms |
[bearbeiten] Rückgabewert
(keine)
[bearbeiten] Beispiel
Führen Sie diesen Code aus
#include <cstdlib> #include <iostream> struct Static { ~Static() { std::cout << "Static destructor\n"; } }; struct Local { ~Local() { std::cout << "Local destructor\n"; } }; Static static_variable; // Destructor of this object *will* be called void atexit_handler() { std::cout << "atexit handler\n"; } int main() { Local local_variable; // Destructor of this object will *not* be called const int result = std::atexit(atexit_handler); // Handler will be called if (result != 0) { std::cerr << "atexit registration failed\n"; return EXIT_FAILURE; } std::cout << "test\n"; std::exit(EXIT_FAILURE); std::cout << "this line will *not* be executed\n"; }
Ausgabe
test atexit handler Static destructor
[bearbeiten] Defect reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3 | C++98 | während der Bereinigung war das Verhalten unklar, wenn (1) eine Funktion bei std::atexit registriert wird oder (2) ein lokales statisches Objekt initialisiert wird |
wurde klargestellt |
[bearbeiten] Siehe auch
| verursacht abnormalen Programmabbruch (ohne Bereinigung) (funktion) | |
| registriert eine Funktion, die bei Aufruf von std::exit() aufgerufen wird (funktion) | |
| (C++11) |
verursacht schnellen Programmabbruch ohne vollständige Bereinigung (funktion) |
| (C++11) |
registriert eine Funktion, die bei Aufruf von std::quick_exit aufgerufen wird (funktion) |
| C-Dokumentation für exit
| |