2009-05-27 6 views
16
  1. Ist es möglich, dieses Ereignis in irgendeiner Weise zu behandeln?
  2. Was passiert in Bezug auf das Abwickeln und Aufheben der Stapelung statischer/globaler Objekte?
+1

+1: Ausgezeichnete Frage :) –

+0

Ausgezeichneter Griff :) –

Antwort

7

EDIT: SIGINT, nicht SIGTERM. Und Assaf meldet, dass keine Objekte (zumindest unter Windows) für unhanded SIGINT zerstört werden.

Das System sendet ein SIGINT. Dieses Konzept gilt (mit einigen Abweichungen) für alle C-Implementierungen. Um es zu handhaben, rufen Sie das Signal auf und geben einen Signal-Handler an. Siehe Dokumentation zur Signalfunktion unter Open Group und MSDN.

Die zweite Frage ist ein wenig komplizierter und kann von der Implementierung abhängen. Die beste Lösung ist das Signal, mit dem Sie delete und exit() manuell verwenden können.

+0

Danke. fyi schlägt die MSDN-Seite, die Sie verknüpften, vor, dass das System ein SIGINT sendet (und NT nach oben SIGTERM überhaupt nicht sendet). –

+0

Danke, Assaf. Korrigiert. –

+0

SIGINT, das in einen ExitProcess übersetzt wird, löst auch keine Zerstörung von Objekten aus (global, lokal statisch, automatisch). Wenn, otoh, Sie das Sigint in exit() übersetzen, wird globals/statics in umgekehrter Reihenfolge der Initialisierung destruktor (aber nicht automatisch). –

13

Ctrl-C in der Konsolenanwendung erzeugt ein Signal. Der Standard-Handler dieses Signals ruft ExitProcess auf, um die Anwendung zu beenden. Sie können dieses Verhalten außer Kraft setzen, indem Sie mit der Funktion SetConsoleCtrlHandler eigene Handlerfunktionen für das Signal festlegen.

+0

+1 für die tatsächliche Beantwortung der Frage! –

+1

Wie steht es mit der Freigabe von Statik? –

4

können Sie testen, ob Stapel Abwickeln auftritt, mit einigen einfachen Code:

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

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

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

Ob es sollte tritt nicht Implementierung abhängig sein, je nachdem, wie die Laufzeit die Ctrl-C behandelt. Meiner Erfahrung nach findet es nicht statt.

+0

Guter Test! Ich stehe korrigiert. –

+0

Es fällt mir schwer, einem solchen Test zu vertrauen, weil ich nie sicher sein werde, ob das Verhalten für unterschiedliche Projektkonfigurationen unterschiedlich ist (z. B. libs, dlls, native, managed, multi-threaded und Kombinationen davon). Also würde ich lieber die "wahre" Antwort haben und mich nicht auf einen solchen Test verlassen. –

+0

Es gibt keine "wahre" Antwort - der C++ Standard hat zu diesem Thema nichts zu sagen, also was Sie bekommen, wird immer implementierungsabhängig sein. –