2009-05-27 9 views
16
  1. Czy można w jakikolwiek sposób obsłużyć to wydarzenie?
  2. Co dzieje się w przypadku rozwijania stosu i deallocation obiektów statycznych/globalnych?
+1

+1: doskonałe pytanie :) –

+0

Doskonały uchwyt :) –

Odpowiedz

7

EDYCJA: SIGINT, a nie SIGTERM. A Assaf informuje, że żadne obiekty nie zostały zniszczone (przynajmniej w systemie Windows) w przypadku nieobsługiwanego SIGINT.

System wysyła komunikat SIGINT. Ta koncepcja ma zastosowanie (z pewną wariancją) dla wszystkich implementacji C. Aby sobie z tym poradzić, wywołujesz sygnał, określając procedurę obsługi sygnału. Zobacz dokumentację funkcji sygnału pod numerami Open Group i MSDN.

Drugie pytanie jest trochę trudniejsze i może zależeć od implementacji. Najlepiej jest obsłużyć sygnał, który pozwala ręcznie użyć delete i exit().

+0

Dzięki. fyi, strona MSDN, z którą się łączysz, sugeruje, że system wysyła SIGINT (i że NT w górę nie wysyła w ogóle SIGTERM). –

+0

Dzięki, Assaf. Poprawione. –

+0

Ponadto SIGINT, który przekłada się na ExitProcess, nie powoduje zniszczenia żadnego rodzaju obiektu (globalny, lokalny statyczny, automatyczny). Jeśli, otoh, przetłumaczysz sigint na exit(), globals/statics będą destruktorami w odwrotnej kolejności od inicjalizacji (ale automatyki nie). –

13

Ctrl-C w aplikacji konsoli wygeneruje sygnał. Domyślny moduł obsługi tego sygnału wywołuje ExitProcess w celu zakończenia aplikacji. Można zmienić to zachowanie, ustawiając własne funkcje obsługi dla sygnału za pomocą funkcji SetConsoleCtrlHandler.

+0

+1 za faktyczne udzielenie odpowiedzi na pytanie! –

+1

Co powiesz na deallocation statyki? –

4

Można sprawdzić, czy stos odwijania występuje z pewnym prostego kodu:

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

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

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

czy nie występuje powinna być zależna od implementacji, w zależności od tego, jak środowisko wykonawcze obsługuje Ctrl-C. Z mojego doświadczenia wynika, że ​​tak się nie dzieje.

+0

Dobry test! Poprawiono mnie. –

+0

Trudno mi zaufać takiemu testowi, ponieważ nigdy nie będę pewien, czy zachowanie będzie się różnić w zależności od konfiguracji projektu (np. Biblioteki, biblioteki dll, natywne, zarządzane, wielowątkowe i ich kombinacje). Więc wolałbym mieć "prawdziwą" odpowiedź i nie polegać na takim teście osobiście. –

+0

Nie ma "prawdziwej" odpowiedzi - Standard C++ nie ma nic do powiedzenia na ten temat, więc to, co dostajesz, zawsze zależy od implementacji. –