Ich möchte wissen, ob Funktionen mit atexit()
vor oder nach dem globalen Variablen zerstört werden, die zerstört werden. Ist dies durch den definierten Standard oder die Implementierung festgelegt?Wann ist eine Funktion registriert mit atexit() genannt
Antwort
Es ist gut definiert und hängt davon ab, ob das betreffende Objekt vor oder nach der Funktion registriert wurde konstruiert wurde mit atexit()
:
3.6.3 Termination
3. Wenn der Abschluss der Initialisierung eines Objekts mit statischer Speicherdauer vor einem Aufruf an
std::atexit
(siehe<cstdlib>
, 18.5) sequenziert wird, wird der Aufruf der Funktion, die anstd::atexit
übergeben wird, vor dem c alles zum Destruktor für das Objekt. Wenn vor dem Abschluss der Initialisierung eines Objekts mit statischer Speicherdauer ein Aufruf anstd::atexit
erfolgt, wird der Aufruf an den Destruktor für das Objekt vor dem Aufruf der Funktion anstd::atexit
übergeben. Wenn ein Anruf zustd::atexit
vor einem anderen Anruf zustd::atexit
sequenziert wird, wird der Anruf zu der Funktion, die zu dem zweitenstd::atexit
-Aufruf übergeben wird, vor dem Aufruf der Funktion, die an den ersten Aufruf übergeben wird, sequenziert.
Interpretation Mein Laien der oben genannten ist, dass Sachen, die vor gebaut hast du atexit(handler)
aufgerufen wird nachhandler()
zerstört genannt wird, und umgekehrt. Ich bin mir sicher, dass es Feinheiten gibt, aber das scheint das Grundprinzip zu sein.
Grundsätzlich ja. Der Wortlaut im Standard ist komplizierter, weil in einem Multithread-Programm "vor" und "nachher" knifflige Definitionen haben und sich nicht immer so verhalten, wie Sie es erwarten würden. – aschepler
Mit einer Anmerkung, dass "konstruiert" bedeutet * der Konstruktor endete * und dass wir nur vollständige Objekte, nicht Basen oder Attribute betrachten. –