std:: atexit
|
Definiert im 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 zur Darstellung* ) |
Registriert die Funktion, auf die func zeigt, um sie beim normalen Programmende aufzurufen (durch std::exit() oder Rückkehr aus der main function )
|
Die Funktionen werden während der Zerstörung der statischen Objekte in umgekehrter Reihenfolge aufgerufen: Wenn A vor B registriert wurde, dann erfolgt der Aufruf von B vor dem Aufruf von A. Dasselbe gilt für die Reihenfolge zwischen statischen Objektkonstruktoren und den Aufrufen von
|
(until C++11) |
|
Die Funktionen können parallel zur Zerstörung der Objekte mit statischer Speicherdauer und zueinander aufgerufen werden, wobei die Garantie erhalten bleibt, dass wenn die Registrierung von A vor der Registrierung von B sequenziert war, dann der Aufruf von B vor dem Aufruf von A sequenziert ist. Dasselbe gilt für die Sequenzierung zwischen statischen Objektkonstruktoren und Aufrufen von
|
(since C++11) |
Dieselbe Funktion kann mehr als einmal registriert werden.
Wenn eine Funktion durch eine Exception beendet wird, std::terminate wird aufgerufen.
atexit
ist threadsicher: Der Aufruf der Funktion aus mehreren Threads führt nicht zu einem Datenwettlauf.
Die Implementierung garantiert die Unterstützung der Registrierung von mindestens 32 Funktionen. Die genaue Obergrenze ist implementierungsdefiniert.
Inhaltsverzeichnis |
Parameter
| func | - | Zeiger auf eine Funktion, die beim normalen Programmende aufgerufen wird |
Rückgabewert
0 wenn die Registrierung erfolgreich ist, andernfalls ein Wert ungleich Null.
Hinweise
Die beiden Überladungen sind unterschiedlich, weil die Typen des Parameters func unterschiedlich sind ( language linkage ist Teil seines Typs).
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
Siehe auch
|
verursacht abnormale Programmbeendigung (ohne Bereinigung)
(Funktion) |
|
|
verursacht normale Programmbeendigung mit Bereinigung
(Funktion) |
|
|
(C++11)
|
verursacht schnelle Programmbeendigung ohne vollständige Bereinigung
(Funktion) |
|
(C++11)
|
registriert eine Funktion, die beim Aufruf von
std::quick_exit
aufgerufen wird
(Funktion) |
|
C-Dokumentation
für
atexit
|
|