2010-02-09 13 views
0

Dans VC++ 7 si je fais ce qui suit:Le gestionnaire null terminate() est-il autorisé?

void myTerminate() 
{ 
    cout << "In myTerminate()"; 
    abort(); 
} 

int main(int, char**) 
{ 
    set_terminate(&myTerminate); 
    set_terminate(0); 
    terminate(); 
    return 0; 
} 

le programme se comporte exactement comme si abort() a été appelé directement, ce qui est exactement ce que l'action par défaut terminate().

Si j'omets l'instruction set_terminate(0);, mon gestionnaire de terminaison est appelé. L'appel du set_terminate(0) semble donc avoir pour effet de réinitialiser le gestionnaire terminate() par défaut.

Ce comportement est-il spécifique à VC++ 7 uniquement? Le programme ne fonctionnera-t-il pas dans un comportement indéfini si j'appelle set_terminate(0) sur une autre implémentation?

Répondre

4

regardant dans la norme révèle ce qui suit:

terminate_handler set_terminate(terminate_handler f) throw(); 

Effets: Etablit la fonction désignée par f en tant que fonction de courant gestionnaire ... coupé
Nécessite : f ne doit pas être un pointeur nul.
Retourne: Le précédent terminate_handler.

Semble être non standard.

+1

Section 18.6.3.2 :) – Manuel

+0

Il s'agit donc d'un comportement non spécifié, n'est-ce pas? – sharptooth

+0

Oui, c'est un comportement indéfini. Vous devez stocker le gestionnaire précédent et le récupérer explicitement. –