Поведение деструктора GCC

Я заметил разницу в поведении деструктора gcc при компиляции под Linux и кросс-компиляции с помощью mingw.

В Linux деструктор не будет вызываться, если только программа не завершится сама по себе (возврат из main). Думаю, это имеет смысл, если принять во внимание обработчики сигналов.

Однако в Win32 деструктор вызывается, если программа завершается, скажем, CTRL-C, но не при завершении работы из диспетчера задач.

Почему это? И что бы вы предложили, чтобы деструктор вызывался независимо от того, как процесс завершается - в частности, на Win32?

Пример кода:

#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");
}

person joveha    schedule 25.05.2010    source источник
comment
Ну, на самом деле невозможно заставить деструктор вызываться в каждом случае. Например, SIGKILL никогда не будет отправлено в вашу программу. ОС просто сотрет его с лица земли.   -  person Carl Norum    schedule 25.05.2010


Ответы (1)


Убийство из менеджера процессов на винде аналогично киллу -9 на линуксе - программе не дается возможность очиститься.

person Yann Ramin    schedule 25.05.2010
comment
Я понимаю. И при завершении работы системы, я полагаю, очистка будет возможна, поскольку это не будет жестким «убийством -9»? - person joveha; 25.05.2010
comment
Если вам нужны сигналы остановки/запуска, я бы посоветовал подключиться к сервисной структуре Windows или к inittab в Linux. - person Yann Ramin; 25.05.2010