2010-05-25 14 views
6

Zauważyłem różnicę w zachowaniu dla destruktora gcc podczas kompilacji pod linux i crosscompiled z mingw.Zachowanie destruktora GCC

Na Linuksie destruktor nie zostanie wywołany, chyba że program zakończy się normalnie samoczynnie (zwraca się z main). Myślę, że to ma sens, jeśli bierzesz pod uwagę programy obsługi sygnałów.

Na Win32 jednak, destruktor jest wywoływany, jeśli program jest zakończony przez powiedz CTRL-C, ale nie, gdy zabity z Task Manager.

Dlaczego tak jest? A co sugerowałbyś, aby destruktor był wywoływany bez względu na to, jak proces się kończy - w szczególności na Win32?

Przykładowy kod:

#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

Nie można wywołać destruktora w * każdym przypadku. Na przykład 'SIGKILL' nigdy nie zostanie wysłany do twojego programu. System operacyjny po prostu go wymazuje. –

Odpowiedz

5

zabić od kierownika procesu w oknie jest analogiczna do kill -9 na Linuksie - program nie ma możliwość, aby oczyścić.

+0

+1, tak jak wspomniałem w moim komentarzu do pierwotnego wpisu. –

+0

Rozumiem. A po wyłączeniu systemu zakładam, że oczyszczenie będzie możliwe, ponieważ nie będzie to trudne "zabicie -9"? – joveha

+0

@joveha, to chyba poprawne, tak. –

Powiązane problemy