std::atexit
| Definiert in Header <cstdlib> |
||
| (1) | ||
int atexit( /* c-atexit-handler */* func ); int atexit( /* atexit-handler */* func ); |
(bis C++11) | |
| int atexit( /* c-atexit-handler */* func ) noexcept; int atexit( /* atexit-handler */* func ) noexcept; |
(seit C++11) | |
| extern "C" using /* c-atexit-handler */ = void(); extern "C++" using /* atexit-handler */ = void(); |
(2) | (nur Exposition*) |
Registriert die durch func gezeigte Funktion, damit sie bei normaler Programmbeendigung (durch std::exit() oder Rückkehr aus der main-Funktion) aufgerufen wird.
|
Die Funktionen werden während der Zerstörung der statischen Objekte in umgekehrter Reihenfolge aufgerufen: Wenn A vor B registriert wurde, dann wird B vor A aufgerufen. Dasselbe gilt für die Reihenfolge zwischen Konstruktoren statischer Objekte und den Aufrufen von |
(bis C++11) |
|
Die Funktionen können gleichzeitig mit der Zerstörung der Objekte mit statischer Speicherdauer und untereinander aufgerufen werden, wobei die Garantie aufrechterhalten wird, dass wenn die Registrierung von A vor der Registrierung von B erfolgte, der Aufruf von B vor dem Aufruf von A erfolgt. Dasselbe gilt für die Sequenzierung zwischen Konstruktoren statischer Objekte und Aufrufen von |
(seit C++11) |
Dieselbe Funktion kann mehrfach registriert werden.
Wenn eine Funktion eine Ausnahme auslöst, wird std::terminate aufgerufen.
atexit ist Thread-sicher: Das Aufrufen der Funktion aus mehreren Threads verursacht keine Datenrace-Bedingung.
Die Implementierung garantiert die Unterstützung der Registrierung von mindestens 32 Funktionen. Die genaue Grenze ist implementierungsabhängig.
Inhalt |
[bearbeiten] Parameter
| func | - | Zeiger auf eine Funktion, die bei normaler Programmbeendigung aufgerufen werden soll |
[bearbeiten] Rückgabewert
0, wenn die Registrierung erfolgreich ist, ein von Null verschiedener Wert andernfalls.
[bearbeiten] Hinweise
Die beiden Überladungen sind verschieden, da die Typen des Parameters func unterschiedlich sind (Sprachverknüpfung ist Teil seines Typs).
[bearbeiten] Beispiel
#include <cstdlib> #include <iostream> void atexit_handler_1() { std::cout << "At exit #1\n"; } void atexit_handler_2() { std::cout << "At exit #2\n"; } int main() { const int result_1 = std::atexit(atexit_handler_1); const int result_2 = std::atexit(atexit_handler_2); if (result_1 || result_2) { std::cerr << "Registration failed!\n"; return EXIT_FAILURE; } std::cout << "Returning from main...\n"; return EXIT_SUCCESS; }
Ausgabe
Returning from main... At exit #2 At exit #1
[bearbeiten] Siehe auch
| verursacht abnormalen Programmabbruch (ohne Bereinigung) (funktion) | |
| verursacht normalen Programmabbruch mit Bereinigung (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 atexit
| |