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

时间:2013-10-16 11:39:13

标签: libc atexit

GNU page说:

  

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

其中一个pages的SDL说:

  

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

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

有人可以从SDL页面上详细说明吗?意思不是那么明显:

  

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

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

以上两个引号是否相互矛盾?

2 个答案:

答案 0 :(得分:2)

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

简短版本:在程序的主程序中调用atexit(SDL_Quit)。如果您在SDL周围使用或编写包装器库,在该库中调用atexit(SDL_Quit),而是在main函数内调用atexit(YOURLIBRARY_Quit)(假设YOURLIBRARY_Quit将处理对SDL_Quit的调用。

答案 1 :(得分:1)

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

但这适用于Linux;不熟悉windows