用户强制我的程序退出时进行清理?

时间:2016-09-08 19:29:28

标签: c exit

在我的C程序中,我有许多动态分配内存的数据结构。如果用户执行以下任何操作:

  • Alt-F4键

  • 点击X

  • 通过任务管理器等强制退出

然后我的程序会有内存泄漏。如何在关闭请求功能上设置,以便在我的程序不自然地关闭之前清理我的全局变量?

2 个答案:

答案 0 :(得分:4)

(您的术语强烈建议使用特定于Windows的应用程序,因此我已经相应地编写了这个答案。在其他现代操作系统上,术语不同,但行为是相同的,除了某些嵌入式环境,但如果您是编码对于那些你不会问这个问题的人。)

首先,操作系统将在终止时自动释放与您的进程关联的所有内存。您永远不必担心RAM的剩余分配。 1

其次,可以在Alt-F4 /窗口关闭时收到通知。我不知道细节,从来没有为Windows编写过GUI应用程序,但应该有一些方法可以安排让它与从应用程序菜单中选择退出一样对待;默认情况下,您的“工具包”甚至可以为您执行此操作。正确使用此通知是将文件保存到磁盘并干净地关闭网络对话。 (操作系统还会自动关闭所有文件句柄,断开所有网络套接字,但它不会为您清除未保存的更改,也不会发送应用层告别消息。)

第三,你不能收到“强制退出”的通知,这是设计上的,因为它是软件相当于工业机器人上的大红色紧急停止按钮 - 它适用于某些情况现在,无论什么比任何潜在的数据丢失更重要,使得该过程立即消失。由于你无法做到这一点,你不应该担心它。

1 正如评论中所讨论的:是的,这意味着在退出之前不必手动释放内存。事实上,如果,那么效率更高,正如herehere所述。需要手动解除分配的“共同智慧”可以追溯到微型计算机的早期阶段; (某些迭代)CP / M和MS-DOS确实需要每个应用程序手动释放内存;现在它是cargo-cult programming的一个实例。

也就是说,在退出之前手动释放内存的一些好理由。最明显的是,一些泄漏检测工具需要你这样做,因为他们不知道应用程序可以释放的内存(如果它已经被困扰)和“应用程序的内存”之间的区别已失去所有有效指针,不能再免费“。一个不太明显的情况是,如果您正在编写库,或者您的应用程序将来可能会变成库。库需要能够根据应用程序的请求手动释放所有分配,因为应用程序可能需要在一个进程的生命周期内多次设置,使用和拆除库。 (但是,如果应用程序在其生命周期内设置一次库,重复使用它,然后在退出之前不打扰它就会更有效率。)

答案 1 :(得分:2)

您可以使用atexit注册要在退出时调用的函数。这应该处理正常终止(通过从main返回或在程序中的任何位置调用exit)和Alt + f4并单击X.但是,当程序被杀死时,程序无法执行任何操作(强制在任务管理器中退出)。幸运的是,大多数现代操作系统可以并且确实清理程序使用的内存,即使它死于非自然原因。

以下是使用atexit的程序示例。该程序创建(或截断)名为atexit.txt的文件。当程序正常终止时,它会将Exited!写入该文件并关闭句柄。

#include <stdlib.h>
#include <stdio.h>

FILE * quitFp;

void onExit(){
    fputs("Exited!", quitFp);
    fclose(quitFp);
}

int main(){
    quitFp = fopen("atexit.txt", "w+");
    if(!quitFp){
        return 1;
    }

    atexit(onExit);

    puts("Press enter to exit");

    getchar();
    return 0;
}

在Windows 8.1上,使用MinGW / GCC编译时,它适用于普通returnexit,当我单击控制台窗口上的X时。