2010-05-25 18 views
6

he notado una diferencia en el comportamiento de destructor GCC cuando se compila bajo Linux y crosscompiled con MinGW.GCC comportamiento destructor

En Linux no se ejecutará el destructor a menos que el programa termine normalmente por sí mismo (devuelve desde main). Supongo que tiene sentido si se tienen en cuenta los manejadores de señales.

En Win32, sin embargo, se llama al destructor si el programa termina con, por ejemplo, un CTRL-C, pero no cuando se cancela desde el Administrador de tareas.

¿Por qué es esto? ¿Y qué sugeriría para hacer que se llame al destructor sin importar cómo finaliza el proceso, en Win32 en particular?

código Ejemplo:

#include <stdio.h> 

int main(int argc, char **argv) { 
     printf("main\n"); 
     while(1) {} 
    return 0; 
} 

__attribute__((destructor)) static void mydestructor(void) { 
     printf("destructor\n"); 
} 
+3

Bueno, no es realmente posible hacer que se llame al destructor en * cada * caso. Por ejemplo, 'SIGKILL' nunca será enviado a su programa. El SO simplemente lo borrará de la existencia. –

Respuesta

5

una matanza desde el gestor de procesos en la ventana es análogo a un kill -9 en Linux - el programa no se le da la oportunidad de limpiar.

+0

+1, tal como lo mencioné en mi comentario sobre la publicación original. –

+0

Ya veo. Y en el cierre del sistema, supongo que será posible la limpieza, ya que no será un 'kill -9' difícil. – joveha

+0

@joveha, eso es probablemente correcto, sí. –