3

GNU页面说:

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

SDL 在其中 一页中 说:

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

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

有人可以详细说明一下,取自 SDL 页面吗?意思不是很明显:

但从库或其他动态加载的代码中执行此操作是不明智的。

使用 atexit() 时要避免哪些陷阱?

上面的两个引用是否相互矛盾?

4

2 回答 2

3

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

简短版:atexit(SDL_Quit)在程序的 main.c 中调用。如果您正在使用或编写围绕 SDL 的包装库,请不要在该库内部调用atexit(SDL_Quit),而是atexit(YOURLIBRARY_Quit)在主函数内部调用(假设YOURLIBRARY_Quit它将处理对SDL_Quit.

于 2013-10-16T11:49:15.200 回答
1

atexit() 有点像 c++ 全局/静态对象的 dtor。我看到的一个陷阱是,atexit 回调由 exit() 调用,但是在调用线程运行回调时,其他线程也在运行,因此您需要确保没有并发问题。就像在 dtor(of global/static obj) 中一样,如果您销毁某些东西,其他线程可能仍在使用它,因此可能会导致意外行为。

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

于 2013-10-16T11:47:08.917 回答