CRT函数atexit()
可以注册在main
函数返回后运行的函数。我想知道使用它的典型场景是什么?是(atexit
)真的有必要吗?
答案 0 :(得分:5)
我认为它的主要用途是当你无法控制main
时,你想确保在它结束时调用某些内容。
图书馆有时会使用这些图书,而不想在终止程序之前明确要求用户程序明确调用其清理函数。
它也用于凤凰单身模式(参见Andrei Alexandrescu的Modern C ++ Design)。
答案 1 :(得分:5)
它可以用于您需要执行的任务,每当应用程序关闭时。通过使用它,您不需要通过在代码中找到的每个exit()之前添加所有清理代码来膨胀您的代码。
一些用例:
答案 2 :(得分:3)
atexit
的主要用途之一是库在程序退出时执行清理。请注意,atexit
在调用exit
时调用,不在程序中止或崩溃时调用,因此您无法在断言失败等情况下进行清理。如果程序调用{{1}},也不会调用它。
如果你有一个可能因某种原因而调用exit的库,你可以直接在主程序中调用它。
请注意,您只能注册数量有限的exec
处理程序,其中“限制”#39;取决于您的操作系统,因此它返回错误状态。
它为C程序提供了在C ++中调用静态变量的析构函数的类似能力。
我用它来删除临时文件,或者(一次或两次)重置一些硬件寄存器。通常,没有必要使用它来关闭文件或释放内存,因为操作系统会为你做这件事。
答案 3 :(得分:2)
编写库时...想象一下在崩溃时将堆栈保存在预定义路径上(或邮件跟踪)的库。
答案 4 :(得分:-1)
可以在atexit()中处理异常。假设多进程环境。有一个物理可用的硬件资源。任何一个进程都可以一次使用该h / w。现在process1获取了h / w资源,并且在处理process1之后没有释放h / w资源。要释放h / w资源,可以使用atexit(),以便process2可以有效地获取h / w。