2012-11-27 12 views

Antwort

20

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 an std::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 an std::atexit erfolgt, wird der Aufruf an den Destruktor für das Objekt vor dem Aufruf der Funktion an std::atexit übergeben. Wenn ein Anruf zu std::atexit vor einem anderen Anruf zu std::atexit sequenziert wird, wird der Anruf zu der Funktion, die zu dem zweiten std::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.

+4

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

+1

Mit einer Anmerkung, dass "konstruiert" bedeutet * der Konstruktor endete * und dass wir nur vollständige Objekte, nicht Basen oder Attribute betrachten. –