使用atexit函数的场景是什么?

7
CRT函数atexit()可以注册一个函数,在main函数返回后运行。我想知道使用这个的典型场景是什么?它(atexit)真的必要吗?

释放任何全局静态变量(可能在main之前或按需设置)是其中一种用途。 - Bathsheba
为了完整性:"...可以注册一个函数...",同时可以注册多个函数。 - alk
请注意,atexit()是标准的C函数,并且由每个C标准(C90、C99、C11、C18、C23等)强制执行。它不特定于Microsoft运行时环境。 - Jonathan Leffler
5个回答

6

我猜它的主要用途是当你没有控制 main 时,你想确保在其结束时调用某些内容。

有时库将使用它,这样用户程序在终止程序之前不需要显式调用它们的清理函数。

它也被用于Phoenix单例模式(见Andrei Alexandrescu的《现代C++设计》)。


6

它可以用于你需要在每次应用程序关闭时执行的任何操作。通过使用它,您无需在代码中添加所有清理代码以保证在每个 exit() 之前都能找到。

一些使用情况:

  • 清理临时文件夹
  • 打印内存转储

atexit不仅用于在应用程序关闭时运行,它是基于二进制/映像的,并且在卸载映像时也可以调用。 - Thomson

3
atexit 的主要用途之一是让库在程序退出时执行清理操作。请注意,atexit 在调用 exit 时被调用,而不是在程序中止或崩溃时被调用,因此您无法在断言失败等情况下执行清理操作。如果程序调用 exec,也不会被调用。
如果您有一个库可能由于某种原因调用 exit,则可以在主程序中直接调用它。
请注意,您只能注册有限数量的 atexit 处理程序,其中“有限”取决于您的操作系统,并且它会返回错误状态。
它为 C 程序提供了类似于在 C++ 中调用静态变量的析构函数的功能。
我曾用它来删除临时文件,或者(一两次)重置一些硬件寄存器。通常不需要使用它来关闭文件或释放内存,因为操作系统会为您完成这些工作。

C程序有析构函数吗?它只适用于C++程序吗? - Thomson
析构函数是类方法。C语言没有类。 - Tom Tanner

1

在编写库时...想象一下一个库,当崩溃时会将堆栈保存在预定义的路径上(或通过邮件发送跟踪信息)。


编辑 - 如评论中所述,此答案是错误的。请不要阅读它。太晚了。


2
程序崩溃时不会调用atexit函数。 - Tom Tanner

-1

可以在 atexit() 中处理异常。假设是多进程环境,有一个硬件资源可用。任何一个进程一次只能使用该硬件资源。现在进程1已经获取了硬件资源,在处理完后没有释放硬件资源。为了释放硬件资源,可以使用 atexit(),这样进程2就可以有效地获取硬件资源。


程序崩溃时不会调用atexit函数。 - Tom Tanner
@TomTanner,是的,如果崩溃了就不会调用atexit。谢谢。所以,我刚才纠正了我的回答。 - mahendiran.b

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