CRT函数
atexit()
可以注册一个函数,在main
函数返回后运行。我想知道使用这个的典型场景是什么?它(atexit
)真的必要吗?我猜它的主要用途是当你没有控制 main
时,你想确保在其结束时调用某些内容。
有时库将使用它,这样用户程序在终止程序之前不需要显式调用它们的清理函数。
它也被用于Phoenix单例模式(见Andrei Alexandrescu的《现代C++设计》)。
它可以用于你需要在每次应用程序关闭时执行的任何操作。通过使用它,您无需在代码中添加所有清理代码以保证在每个 exit() 之前都能找到。
一些使用情况:
atexit
的主要用途之一是让库在程序退出时执行清理操作。请注意,atexit
在调用 exit
时被调用,而不是在程序中止或崩溃时被调用,因此您无法在断言失败等情况下执行清理操作。如果程序调用 exec
,也不会被调用。atexit
处理程序,其中“有限”取决于您的操作系统,并且它会返回错误状态。在编写库时...想象一下一个库,当崩溃时会将堆栈保存在预定义的路径上(或通过邮件发送跟踪信息)。
编辑 - 如评论中所述,此答案是错误的。请不要阅读它。太晚了。
可以在 atexit() 中处理异常。假设是多进程环境,有一个硬件资源可用。任何一个进程一次只能使用该硬件资源。现在进程1已经获取了硬件资源,在处理完后没有释放硬件资源。为了释放硬件资源,可以使用 atexit(),这样进程2就可以有效地获取硬件资源。
main
之前或按需设置)是其中一种用途。 - Bathshebaatexit()
是标准的C函数,并且由每个C标准(C90、C99、C11、C18、C23等)强制执行。它不特定于Microsoft运行时环境。 - Jonathan Leffler