首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候应该使用atexit()?

什么时候应该使用atexit()?
EN

Stack Overflow用户
提问于 2013-10-16 11:39:13
回答 2查看 1.8K关注 0票数 3

GNU 页面说:

如果发生正常终止,您的程序可以安排运行自己的清理功能。如果您正在编写一个库以供在各种应用程序中使用,那么在退出之前坚持要求所有应用程序显式调用库的清理功能是不可靠的。--通过使用atexit或on_exit在库中设置清理函数,使应用程序不可见的清理功能要健壮得多。

在其中一个页面中,SDL说:

您可以使用SDL_Quit()atexit()来确保在应用程序关闭时运行它,但是从库或其他动态加载的代码中这样做是不明智的。

我从GNU页面了解到,它鼓励在程序中使用atexit()。

有人能从SDL页面中详细说明这一点吗?其含义并不那么明显:

但是,在库或其他动态加载的代码中这样做是不明智的。

在使用atexit()时,应该避免哪些缺陷?

这两句话相互矛盾吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-16 11:49:15

不,SDL是说不要从库中调用atexit(SDL_Quit)。GNU建议您在库中设置atexit以避免清理问题,SDL说不要从不同的库调用它--由于动态代码卸载的方式,您无法确定排序(特别是在多线程应用程序中)。

简短的版本:在你的程序主程序中调用atexit(SDL_Quit)。如果您正在围绕SDL使用或编写包装器库,则不要在该库中调用atexit(SDL_Quit),而是在主函数中调用atexit(YOURLIBRARY_Quit) (假定YOURLIBRARY_Quit将处理对SDL_Quit的调用。

票数 3
EN

Stack Overflow用户

发布于 2013-10-16 11:47:08

atexit()在某种程度上类似于c++全局/静态对象的dtor。我一直看到的一个缺陷是,atexit回调是由exit()调用的,但是当调用线程运行回调时,其他线程也在运行,因此您需要确保没有并发问题。就像在dtor(全局/静态obj)中一样,如果您破坏了某个东西,其他线程可能仍然在使用它,因此它可能会导致意外的行为。

但这是针对Linux的;不熟悉windows。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19402417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档