如何在C ++中使用atexit

时间:2016-09-17 17:16:52

标签: c++

我正在使用C ++作业,并且指示说使用atexit()会很好,如下所示:

  

“如果中止,请确保程序干净地退出(使用atexit()处理程序是一种很好的方法)。”

家庭作业与中止程序执行无关(它与内存管理有关),这只是一个建议,但我不知道如何使用它。处理这种情况的原因是因为程序在运行时可能需要很长时间才能执行,具体取决于某些参数。如果花费的时间太长,我可能会输入CTRL-C或其他组合键来异常停止执行。

这就是我所做的。

void AtExitFunc()
{
    release_allocator();
}

int main(int argc, char ** argv) {
    // Set default values.
    int intMemSize = 512;
    int intBasicBlock = 128;

    atexit(AtExitFunc);
    init_allocator(intBasicBlock, intMemSize);
    ackerman_main();
    release_allocator();

    return 0;
}

1 个答案:

答案 0 :(得分:0)

CTRL - C 会产生SIGINT信号,默认情况下会立即终止进程,而不会调用任何函数。

正如您的C库文档的atexit()手册页所解释的那样,atexit()安装的函数在进程通过显式调用exit()或从main()。这是调用atexit() - 安装的处理程序时唯一的情况。

这很好,因为让你的程序被操作系统终止几乎关闭书籍,拦截信号并调用你的清理功能(假设它完全可重入,这是不太可能的)绝对完成反正没什么用的。只是指出这与处理 CTRL - C 无关。

无论如何,假设您的init_allocator()无法自行调用exit(),请在调用init_allocator()之前或之后安装退出处理程序。

但是,init_allocator()在内部处理自己安装退出处理程序的效果稍好一些。这样,安装退出处理程序的事实是完全透明的。

此外,如果release_allocator()被调用两次,您应确保不会发生任何伤害。在您的示例中,它从main()显式调用两次,并在main()返回后第二次调用(因为您的main()直接调用函数的事实不会使安装的出口处理程序神奇地离开了。)