2009-05-27 8 views
16
  1. È possibile gestire questo evento in qualche modo?
  2. Cosa succede in termini di stack di unwinding e deallocation di oggetti statici/globali?
+1

+1: Ottima domanda :) –

+0

Eccellente handle :) –

risposta

7

MODIFICA: SIGINT, non SIGTERM. E Assaf riporta che nessun oggetto viene distrutto (almeno su Windows) per SIGINT non gestito.

Il sistema invia un SIGINT. Questo concetto si applica (con qualche variazione) per tutte le implementazioni di C. Per gestirlo, si chiama segnale, specificando un gestore di segnale. Vedere la documentazione sulla funzione di segnale su Open Group e MSDN.

La seconda domanda è un po 'più complicata e può dipendere dall'implementazione. La soluzione migliore è gestire il segnale, che consente di utilizzare manualmente delete e exit().

+0

Grazie. fyi, la pagina MSDN a cui ti sei collegato suggerisce che il sistema invia un SIGINT (e che NT verso l'alto non invia affatto SIGTERM). –

+0

Grazie, Assaf. Corretto. –

+0

Inoltre, SIGINT, che si traduce in un ExitProcess, non attiva la distruzione di alcun tipo di oggetto (globale, locale statico, automatico). Se, otoh, si traduce il sigint in exit(), globals/statics saranno destructor in ordine inverso di inizializzazione (ma non automatico). –

13

Ctrl-C nell'applicazione console genera un segnale. Il gestore predefinito di questo segnale chiama ExitProcess per terminare l'applicazione. È possibile ignorare questo comportamento impostando le proprie funzioni di gestione per il segnale utilizzando la funzione SetConsoleCtrlHandler.

+0

+1 per rispondere effettivamente alla domanda! –

+1

Che dire della deallocazione della statica? –

4

È possibile verificare se si verifica pila di svolgimento, con qualche semplice codice:

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

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

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

Sia che si verifica non dovrebbe essere a carico di attuazione, a seconda di come il runtime gestisce il Ctrl-C. Nella mia esperienza, non ha luogo.

+0

Buona prova! Sono corretto. –

+0

Ho difficoltà a credere in un test del genere, perché non sarò mai sicuro se il comportamento sarà diverso per le diverse configurazioni di progetto (ad esempio libs, dlls, native, managed, multi-threaded e loro combinazioni). Quindi preferirei avere la risposta "vera" e non fare affidamento su un test del genere. –

+0

Non c'è una risposta "vera" - lo standard C++ non ha nulla da dire su questo argomento, quindi quello che ottieni sarà sempre dipendente dall'implementazione. –

Problemi correlati