2009-05-27 22 views
16
  1. ¿Es posible manejar este evento de alguna manera?
  2. ¿Qué sucede en términos de desenrollado de la pila y desasignación de objetos estáticos/globales?
+1

+1: Excelente pregunta :) –

+0

Excelente mango :) –

Respuesta

7

EDITAR: SIGINT, not SIGTERM. Y Assaf informa que no se destruyen objetos (al menos en Windows) para SIGINT sin manos.

El sistema envía un SIGINT. Este concepto se aplica (con alguna variación) para todas las implementaciones de C. Para manejarlo, usted llama a la señal, especificando un manejador de señal. Consulte la documentación sobre la función de señal en Open Group y MSDN.

La segunda pregunta es un poco más complicada y puede depender de la implementación. La mejor opción es manejar la señal, lo que le permite usar delete y exit() manualmente.

+0

Gracias. fyi, la página de MSDN a la que vinculó sugiere que el sistema envía un SIGINT (y que NT hacia arriba no envía SIGTERM en absoluto). –

+0

Gracias, Assaf. Corregido –

+0

Además, SIGINT, que se traduce en un ExitProcess, no desencadena la destrucción de ningún tipo de objeto (global, local estático, automático). Si, otoh, traduces sigint a exit(), globals/static será destructor en orden inverso de inicialización (pero no automático). –

13

Ctrl-C en la aplicación de consola generará una señal. El controlador predeterminado de esta señal llama a ExitProcess para terminar la aplicación. Puede anular este comportamiento estableciendo sus propias funciones de controlador para la señal usando la función SetConsoleCtrlHandler.

+0

+1 por responder la pregunta. –

+1

¿Qué hay de la desasignación de la estática? –

4

Puede probar si se produce el desenrollado de pila, con algo de código simple:

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

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

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

Tanto si se produce no debe ser dependiente de la implementación, dependiendo de cómo el tiempo de ejecución se encarga de la Ctrl-C. En mi experiencia, no tiene lugar.

+0

¡Buena prueba! Estoy corregido. –

+0

Me resulta difícil confiar en una prueba de este tipo, porque nunca estaré seguro de si el comportamiento será diferente para distintas configuraciones de proyecto (por ejemplo, libs, dlls, nativo, administrado, multihebra y combinaciones de las mismas). Así que preferiría tener la respuesta "verdadera" y no confiar en esa prueba yo mismo. –

+0

No hay una respuesta "verdadera": el estándar C++ no tiene nada que decir sobre este tema, por lo tanto, lo que obtenga siempre dependerá de la implementación. –

Cuestiones relacionadas