GNU 页面说:
如果发生正常终止,您的程序可以安排运行自己的清理功能。如果您正在编写一个库以供在各种应用程序中使用,那么在退出之前坚持要求所有应用程序显式调用库的清理功能是不可靠的。--通过使用atexit或on_exit在库中设置清理函数,使应用程序不可见的清理功能要健壮得多。
在其中一个页面中,SDL说:
您可以使用
SDL_Quit()和atexit()来确保在应用程序关闭时运行它,但是从库或其他动态加载的代码中这样做是不明智的。
我从GNU页面了解到,它鼓励在程序中使用atexit()。
有人能从SDL页面中详细说明这一点吗?其含义并不那么明显:
但是,在库或其他动态加载的代码中这样做是不明智的。
在使用atexit()时,应该避免哪些缺陷?
这两句话相互矛盾吗?
发布于 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的调用。
发布于 2013-10-16 11:47:08
atexit()在某种程度上类似于c++全局/静态对象的dtor。我一直看到的一个缺陷是,atexit回调是由exit()调用的,但是当调用线程运行回调时,其他线程也在运行,因此您需要确保没有并发问题。就像在dtor(全局/静态obj)中一样,如果您破坏了某个东西,其他线程可能仍然在使用它,因此它可能会导致意外的行为。
但这是针对Linux的;不熟悉windows。
https://stackoverflow.com/questions/19402417
复制相似问题