【发布时间】:2014-08-04 09:33:16
【问题描述】:
CRT 函数atexit() 可以注册一个函数以在main 函数返回后运行。我想知道使用它的典型场景是什么? (atexit) 真的有必要吗?
【问题讨论】:
-
释放任何全局静态数据(可以在
main之前设置或即时设置)是一种用途。 -
为了完整性:“...可以注册一个函数...”也可以注册多个函数。
CRT 函数atexit() 可以注册一个函数以在main 函数返回后运行。我想知道使用它的典型场景是什么? (atexit) 真的有必要吗?
【问题讨论】:
main 之前设置或即时设置)是一种用途。
我猜它的主要用途是当你无法控制 main 并且你想确保在它的末尾调用某些东西。
它有时被那些不想坚持用户程序在终止程序之前显式调用其清理函数的库使用。
它也用于凤凰单例模式(参见 Andrei Alexandrescu 的 Modern C++ Design)。
【讨论】:
它可用于您希望每次应用程序关闭时都需要执行的操作。通过使用它,您无需通过在代码中可以找到的每个 exit() 之前添加所有清理代码来使代码膨胀。
一些用例:
【讨论】:
atexit 的主要用途之一是库在程序退出时执行清理。请注意,atexit 在调用 exit 时调用,不是在程序中止或崩溃时调用,因此您无法对断言失败等进行清理。如果程序调用exec,它也不会被调用。
如果你有一个库由于某种原因可能会调用 exit,你可以直接在主程序中调用它。
请注意,您只能注册有限数量的 atexit 处理程序,其中“有限”取决于您的操作系统,因此它会返回错误状态。
它为 C 程序提供了与在 C++ 中调用静态变量的析构函数类似的能力。
我用它来删除临时文件,或者(一次或两次)重置一些硬件寄存器。通常不需要用它来关闭文件或释放内存,因为操作系统会为你做这些。
【讨论】:
在编写库时...想象一下,一个库在崩溃时将堆栈保存在预定义的路径上(或邮寄跟踪)。
编辑 - 正如评论中提到的,这个答案是错误的。不要读它。太晚了。
【讨论】:
异常可以在atexit()中处理。假设是多进程环境。有一个硬件资源是物理可用的。任何一个过程都可以一次使用该硬件。现在 process1 获得了 h/w 资源,处理后 process1 没有释放 h/w 资源。要释放 h/w 资源,可以使用 atexit(),以便 process2 可以有效地获取 h/w。
【讨论】: