GCC析构函数行为

6
我注意到在Linux下编译和使用mingw交叉编译时,gcc的析构函数行为有所不同。
在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");
}

3
其实不可能让析构函数在每种情况下都被调用。例如,SIGKILL永远不会被发送到您的程序中。操作系统将直接使其消失。 - Carl Norum
1个回答

5
在Windows上,进程管理器中的“结束进程”类似于Linux上的“kill -9”,程序不会有机会进行清理。

我明白了。在系统关闭时,我想清理工作是可能的,因为它不会是一个硬性的“kill -9”? - joveha
如果您需要停止/启动信号,我建议连接到Windows服务框架或Linux上的inittab。 - Yann Ramin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接