Namespaces
Variants

std:: atexit

From cppreference.net
Utilities library
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 atexit : siehe std::exit .

(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 atexit : siehe std::exit .

(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)
registriert eine Funktion, die beim Aufruf von std::quick_exit aufgerufen wird
(Funktion)
C-Dokumentation für atexit