2010-04-19 9 views
17

Lassen Sie uns sagen, dass ich den folgenden Code haben:Wird exit() oder eine Ausnahme verhindern, dass ein End-of-Scope-Destruktor aufgerufen wird?

struct mytype 
{ 
    ~mytype() { /* do something like call Mix_CloseAudio etc */ } 
}; 

int main() 
{ 
    mytype instant; 

    init_stuff(); 

    start(); 

    return 0; 
} 

Ist das destructor auch genannt werden garantiert, wenn exit() von irgendwo innen start() wird verwendet?

+2

Ausnahmen werden den Destruktor aufrufen, 'exit()' wird nicht. – falstro

+0

Nicht genau dieser Fall, aber ich habe Destruktoren für * statische Objekte * auf Linux mit GCC aufgerufen. –

Antwort

21

Wenn Sie 10 aufrufen, wird der Destruktor nicht aufgerufen.

Aus dem C++ Standard (§3.6.1/4):

Aufruf der Funktion

void exit(int); 

in <cstdlib> (18.3) erklärt das Programm beendet, ohne die aktuelle zu verlassen blockieren und somit ohne Objekte mit automatischer Speicherdauer zu zerstören (12.4). Wenn exit aufgerufen wird, um ein Programm während der Zerstörung eines Objekts mit statischer Speicherdauer zu beenden, hat das Programm ein undefiniertes Verhalten.

16

Ja, dem Aufruf von exit() bedeutet, dass die destructor wird nicht aufgerufen werden: die Funktion void exit (int)

aufrufen; in <cstdlib> deklariert (18.3) beendet das Programm ohne den aktuellen Block und damit ohne zerstören alle Objekte mit automatischer Speicherdauer (12.4). Wenn exit aufgerufen wird, um ein Programm während der Zerstörung eines Objekts mit statischer Speicherdauer zu beenden, hat das Programm undefined Verhalten.

Wenn eine Ausnahme ausgelöst wird, wird der Destruktor aufgerufen. Dies ist die Grundlage der Ausnahmesicherheit in C++.

3

Ausnahmen werden Destruktoren aufrufen, solange etwas im Programm die Ausnahme abfängt. Wenn die Ausnahme die main() -Funktion verlässt, ohne dass sie abgefangen wird, benötigt der Standard nicht, dass die Laufzeit den Stapel zur Bereinigung aufräumt.

eine garantiert

try{ 
    // code 
}catch(...){ //that elipsis should actually appear in your code 
      //it doesn't mean I omitted code here. 
    //code 
} 

in Ihrer main() Funktion verwenden, dass jede Ausnahme gefangen wird, und alle Destruktoren aufgerufen werden.

Verwandte Themen