2009-05-27 4 views
16
  1. Est-il possible de gérer cet événement d'une manière ou d'une autre?
  2. Que se passe-t-il en termes de déroulement de pile et de désallocation d'objets statiques/globaux?
+1

+1: Excellente question :) –

+0

Excellent handle :) –

Répondre

7

EDIT: SIGINT, pas SIGTERM. Et Assaf rapporte qu'aucun objet n'est détruit (au moins sous Windows) pour SIGINT non géré.

Le système envoie un SIGINT. Ce concept s'applique (avec quelques variantes) pour toutes les implémentations C. Pour le gérer, vous appelez le signal, en spécifiant un gestionnaire de signal. Voir la documentation sur la fonction de signal au Open Group et MSDN.

La deuxième question est un peu plus complexe et peut dépendre de l'implémentation. Le meilleur pari est de gérer le signal, ce qui vous permet d'utiliser manuellement delete et exit(). Ctrl-C dans l'application de console va générer un signal

+0

Merci. fyi, la page MSDN que vous avez liée suggère que le système envoie un SIGINT (et que NT vers le haut n'envoie pas SIGTERM du tout). –

+0

Merci, Assaf. Corrigée. –

+0

En outre, SIGINT, qui se traduit par un processus Exit, ne déclenche pas la destruction de tout type d'objet (global, local static, automatique). Si, otoh, vous traduisez le sigint en exit(), les globals/statiques seront destructeurs dans l'ordre inverse de l'initialisation (mais pas automatiquement). –

13

Le gestionnaire par défaut de ce signal appelle ExitProcess pour terminer l'application. Vous pouvez remplacer ce comportement en définissant vos propres fonctions de gestionnaire pour le signal à l'aide de la fonction SetConsoleCtrlHandler.

+0

+1 pour répondre réellement à la question! –

+1

Qu'en est-il de la désallocation de la statique? –

4

Vous pouvez vérifier si le déroulement de la pile se produit, avec un code simple:

#include <iostream> 
#include <windows.h> 
using namespace std; 

struct A { 
    ~A() { cerr << "unwound" << endl; } 
}; 

int main() { 
    A a; 
    while(1) { 
     Sleep(1000); 
    } 
} 

Que ce produit ne devrait être mise en œuvre dépend, selon la façon dont l'exécution gère les touches Ctrl-C. D'après mon expérience, cela n'a pas lieu.

+0

Bon test! Je me suis trompé. –

+0

J'ai du mal à faire confiance à un tel test, car je ne saurai jamais si le comportement sera différent pour différentes configurations de projet (par exemple libs, dlls, natives, gérées, multithread et leurs combinaisons). Donc, je préfère avoir la "vraie" réponse et ne pas me fier à un tel test moi-même. –

+0

Il n'y a pas de "vraie" réponse - le standard C++ n'a rien à dire sur ce sujet, donc ce que vous obtenez dépend toujours de l'implémentation. –

Questions connexes