C 您使用退出处理程序的目的是什么?
可能重复:C 您使用退出处理程序的目的是什么?,c,unix,C,Unix,可能重复: 至少在UNIX中:我知道C/C++可以注册许多函数,以便在主出口处理程序的出口处调用。要调用的函数可以使用以下方法按相反顺序注册: int atexit(void (*func) (void)); 不过,我很难确定这是否有用。这些函数是void/void和global,因此它们不太可能访问程序中的许多变量,除非这些变量也是全局变量。有人能告诉我你会用出口处理程序做什么吗 此外,退出处理程序在非UNIX平台上的工作方式是否相同,因为它们是ANSI C规范的一部分?您可以在atexi
至少在UNIX中:我知道C/C++可以注册许多函数,以便在主出口处理程序的出口处调用。要调用的函数可以使用以下方法按相反顺序注册:
int atexit(void (*func) (void));
不过,我很难确定这是否有用。这些函数是void/void和global,因此它们不太可能访问程序中的许多变量,除非这些变量也是全局变量。有人能告诉我你会用出口处理程序做什么吗
此外,退出处理程序在非UNIX平台上的工作方式是否相同,因为它们是ANSI C规范的一部分?您可以在
atexit
处理程序中对全局对象执行清理:
static my_type *my_object;
static void my_object_release() { free(my_object); }
my_type *get_my_object_instance()
{
if (!my_object)
{
my_object = malloc(sizeof(my_type));
...
atexit(my_object_release);
}
return my_object;
}
如果您希望能够关闭类似atexit的处理程序中的某些变量,您可以设计自己的数据结构,其中包含清理函数/参数对,并注册一个atexit处理程序,用相应的参数调用所有上述函数。阅读以下博客文章:
当一个程序终止时,它需要做一些收尾工作
例如,将数据保存到将在下一个会话中使用的文件中。在里面
每个程序都有一组特定的事情要做,这取决于
出于程序目的(关闭时)。做过这样的事吗
由一个函数完成,该函数的指针将是
atexit函数
atexit
功能的目的是注册(记录在内存中)
这些收尾工作的功能。当atexit函数
使用指向这些函数的任何指针作为参数执行
已注册指向函数。这必须在C++之前完成。
程序到达终止阶段
阅读更多信息:退出处理程序允许库在主程序不知道需要的情况下进行关机清理(从而清除全局数据结构)。我在退出处理程序中完成的两个示例:
- 恢复tty标志
- 正确关闭网络连接,使对等方不必等待超时
您可能可以考虑其他用途。atexit处理程序解决的最明显问题是整理全局对象。这是一个C特性,当然C没有像C++那样自动解除分配。如果您可以访问
main
的实现,您可以编写自己的此类代码,但在其他方面atexit
可能会有帮助。用于释放内存。等等。好问题!1)生成代码(思考<代码> ATUT(Run-StasyAsDebug);< /COD>)2)示例代码(<代码> ATSUT(SDLXOUT);< /COD>)3)在后面的代码中与调用代码>退出>代码的接口连接,还有一个问题-它在C++中还是有用的吗?还是有点被贬低了?我认为你可以在C++中使用RAII。代码> ATEX/<代码>非常un-c++。C++中的“代码> >退出<代码>有“有效”用法。释放一个单例实例就是一个例子。回顾我的答案,我意识到由于操作系统在程序退出时清理内存,所以不需要使用atexit
。但是,它对其他资源很有用,如关闭网络连接、清理临时文件、保存程序状态等。在我看来,@AProgrammer给出的答案更好。你可能是对的,不需要释放,因为程序已经终止并释放了所有内容,对不对?@turmuka:Yes,返回内存并关闭打开的文件。不过,在程序退出时,您可能还需要做其他事情。在检查IO错误时关闭文件(通常很棘手),或正确关闭远程连接等。atexit可用于关闭网络连接以保持稳定性。