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

d7v8vwbk  于 2023-04-11  发布在  其他
关注(0)|答案(5)|浏览(139)

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

lc8prwob

lc8prwob1#

我猜它的主要用途是当你不能控制main,你想确保在它的末尾调用一些东西。
它有时被一些库所使用,这些库不想坚持用户程序在终止程序之前显式地调用它们的清理函数。
它也被用在phoenix singleton模式中(参见Andrei Alexandrescu的Modern C++ Design)。

kb5ga3dv

kb5ga3dv2#

它可以用于在应用程序每次关闭时都需要执行的任务。使用它,您不需要在代码中找到的每个exit()之前添加所有清理代码来膨胀代码。
一些用例:

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

zwghvu4y3#

atexit的主要用途之一是让库在程序退出时执行清理。注意,atexit是在调用exit时调用的,不是在程序中止或崩溃时调用的,所以你不能在Assert失败等情况下执行清理。如果程序调用exec,它也不会被调用。
你可以直接在主程序中调用它,如果你有一个库,可能会因为某种原因调用exit。
请注意,您只能注册有限数量的atexit处理程序,其中“limited”取决于您的操作系统,因此它返回错误状态。
它赋予C程序类似于调用C++中静态变量的析构函数的能力。
我曾经用它来删除临时文件,或者(一两次)重置一些硬件寄存器。一般来说,没有必要用它来关闭文件或释放内存,因为操作系统会为你做这些。

wrrgggsh

wrrgggsh4#

当编写库时……想象一个库在崩溃时将堆栈保存在预定义的路径上(或发送跟踪)。
编辑-正如评论中提到的,这个答案是错误的。不要读它。太晚了。

68de4m5k

68de4m5k5#

异常可以在atexit()中处理。假设多进程环境。有一个硬件资源是物理可用的。任何一个进程都可以一次使用该硬件资源。现在process1获得了硬件资源,并且处理后process1没有释放硬件资源。为了释放硬件资源,可以使用此atexit(),以便process2可以有效地获得硬件资源。

相关问题