2010-04-19 17 views
17

Disons que j'ai le code suivant:Est-ce que exit() ou une exception empêchera l'appel d'un destructeur de fin d'étendue?

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

int main() 
{ 
    mytype instant; 

    init_stuff(); 

    start(); 

    return 0; 
} 

Est-ce destructor garanti d'être appelé, même si la sortie() est utilisée de quelque part à l'intérieur de début()?

+2

exceptions appellera le destructeur, 'exit()' ne le fera pas. – falstro

+0

Pas exactement ce cas mais j'ai des destructeurs appelés * objets statiques * sur Linux avec GCC. –

Répondre

21

Si vous appelez exit, le destructeur ne sera pas appelé.

de la norme C++ (§3.6.1/4):

appel de la fonction

void exit(int); 

déclaré dans <cstdlib> (18.3) se termine le programme sans sortir du courant bloquer et donc sans détruire les objets avec une durée de stockage automatique (12.4). Si exit est appelé pour terminer un programme lors de la destruction d'un objet avec une durée de stockage statique, le programme a un comportement indéfini.

16

Oui, appeler exit() signifie la destructor ne sera pas appelé:

appel de la fonction void exit (int); déclaré dans <cstdlib> (18.3) termine le programme sans laisser le bloc actuel et donc sans détruire tous les objets avec la durée de stockage automatique (12.4). Si la sortie est appelée pour mettre fin à un programme pendant la destruction d'un objet ayant une durée de stockage statique, le programme a un comportement non défini .

Si une exception est levée, le destructeur sera appelé. C'est la base de la sécurité des exceptions en C++.

3

Les exceptions appellent des destructeurs, tant que quelque chose dans le programme intercepte l'exception. Si l'exception quitte la fonction main() sans être interceptée, la norme ne nécessite pas l'exécution pour dérouler la pile à nettoyer.

L'utilisation d'un

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

dans votre fonction main() garantira que chaque exception est pris, et tous les destructeurs sont appelés.