CRT函数atexit()可以注册一个函数在main函数返回后运行。我想知道使用这个的典型场景是什么?它(atexit)真的有必要吗?
atexit()
main
atexit
lc8prwob1#
我猜它的主要用途是当你不能控制main,你想确保在它的末尾调用一些东西。它有时被一些库所使用,这些库不想坚持用户程序在终止程序之前显式地调用它们的清理函数。它也被用在phoenix singleton模式中(参见Andrei Alexandrescu的Modern C++ Design)。
kb5ga3dv2#
它可以用于在应用程序每次关闭时都需要执行的任务。使用它,您不需要在代码中找到的每个exit()之前添加所有清理代码来膨胀代码。一些用例:
zwghvu4y3#
atexit的主要用途之一是让库在程序退出时执行清理。注意,atexit是在调用exit时调用的,不是在程序中止或崩溃时调用的,所以你不能在Assert失败等情况下执行清理。如果程序调用exec,它也不会被调用。你可以直接在主程序中调用它,如果你有一个库,可能会因为某种原因调用exit。请注意,您只能注册有限数量的atexit处理程序,其中“limited”取决于您的操作系统,因此它返回错误状态。它赋予C程序类似于调用C++中静态变量的析构函数的能力。我曾经用它来删除临时文件,或者(一两次)重置一些硬件寄存器。一般来说,没有必要用它来关闭文件或释放内存,因为操作系统会为你做这些。
exit
exec
wrrgggsh4#
当编写库时……想象一个库在崩溃时将堆栈保存在预定义的路径上(或发送跟踪)。编辑-正如评论中提到的,这个答案是错误的。不要读它。太晚了。
68de4m5k5#
异常可以在atexit()中处理。假设多进程环境。有一个硬件资源是物理可用的。任何一个进程都可以一次使用该硬件资源。现在process1获得了硬件资源,并且处理后process1没有释放硬件资源。为了释放硬件资源,可以使用此atexit(),以便process2可以有效地获得硬件资源。
5条答案
按热度按时间lc8prwob1#
我猜它的主要用途是当你不能控制
main
,你想确保在它的末尾调用一些东西。它有时被一些库所使用,这些库不想坚持用户程序在终止程序之前显式地调用它们的清理函数。
它也被用在phoenix singleton模式中(参见Andrei Alexandrescu的Modern C++ Design)。
kb5ga3dv2#
它可以用于在应用程序每次关闭时都需要执行的任务。使用它,您不需要在代码中找到的每个exit()之前添加所有清理代码来膨胀代码。
一些用例:
zwghvu4y3#
atexit
的主要用途之一是让库在程序退出时执行清理。注意,atexit
是在调用exit
时调用的,不是在程序中止或崩溃时调用的,所以你不能在Assert失败等情况下执行清理。如果程序调用exec
,它也不会被调用。你可以直接在主程序中调用它,如果你有一个库,可能会因为某种原因调用exit。
请注意,您只能注册有限数量的
atexit
处理程序,其中“limited”取决于您的操作系统,因此它返回错误状态。它赋予C程序类似于调用C++中静态变量的析构函数的能力。
我曾经用它来删除临时文件,或者(一两次)重置一些硬件寄存器。一般来说,没有必要用它来关闭文件或释放内存,因为操作系统会为你做这些。
wrrgggsh4#
当编写库时……想象一个库在崩溃时将堆栈保存在预定义的路径上(或发送跟踪)。
编辑-正如评论中提到的,这个答案是错误的。不要读它。太晚了。
68de4m5k5#
异常可以在atexit()中处理。假设多进程环境。有一个硬件资源是物理可用的。任何一个进程都可以一次使用该硬件资源。现在process1获得了硬件资源,并且处理后process1没有释放硬件资源。为了释放硬件资源,可以使用此atexit(),以便process2可以有效地获得硬件资源。