Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么';使用atexit函数的场景是什么?_C_Msvcrt_Crt - Fatal编程技术网

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

C 什么';使用atexit函数的场景是什么?,c,msvcrt,crt,C,Msvcrt,Crt,CRT函数atexit()可以注册一个函数以在main函数返回后运行。我想知道使用这个的典型场景是什么?它(atexit)真的有必要吗?我想它的主要用途是当您无法控制main并且希望确保在它的末尾调用某个东西时 它有时被不希望坚持用户程序在终止程序之前显式调用其清理函数的库使用 < P>也适用于凤凰单子模式(参见Andrei Alexandrescu的现代C++设计)。 < P>异常可在AT出口()中处理。假设多进程环境。有一个硬件资源在物理上可用。任何一个过程一次都可以使用该h/w。现在pro

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

我想它的主要用途是当您无法控制
main
并且希望确保在它的末尾调用某个东西时

它有时被不希望坚持用户程序在终止程序之前显式调用其清理函数的库使用


< P>也适用于凤凰单子模式(参见Andrei Alexandrescu的现代C++设计)。

< P>异常可在AT出口()中处理。假设多进程环境。有一个硬件资源在物理上可用。任何一个过程一次都可以使用该h/w。现在process1获取了h/w资源,处理后process1未释放h/w资源。要释放h/w资源,可以使用此atexit(),以便process2可以有效地获取h/w。

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

一些用例:

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

编写库时。。。设想一个库在崩溃时将堆栈保存在预定义的路径上(或发送跟踪)



编辑-正如评论中提到的,这个答案是错误的。不要读它。太晚了。

atexit的主要用途之一是让库在程序退出时执行清理。请注意,调用
exit
时调用
atexit
,程序中止或崩溃时调用not,因此不能对断言失败等执行清理。如果程序调用
exec
,也不会调用它

如果您有可能出于某种原因调用exit的库,您可以在主程序中直接调用它

请注意,您只能注册有限数量的
atexit
处理程序,其中“limited”取决于您的操作系统,因此它会返回错误状态

<> P.它给出了C程序调用C++中静态变量析构函数的类似能力。
我用它来删除临时文件,或者(一次或两次)重置一些硬件寄存器。一般来说,不必使用它来关闭文件或释放内存,因为O/s会为您这样做。

释放任何全局静态(可以在
main
之前设置,也可以在实时基础上设置)是一种用途。为了完整性:“…可以注册函数…”此外,还可以注册多个函数。atexit不在crashatexit上调用;atexit不在crashatexit上调用crash@TomTanner,是的,崩溃时不调用atexit。非常感谢。所以,我刚刚更正了我上面的答案。C程序有析构函数吗。是C++程序吗?析构函数是类方法。c没有类。atexit不仅用于在应用程序关闭时运行,它是基于二进制/映像的,并且在卸载映像时也可以调用。