有多种退出流程的方法:
例如:ExitProcess,ExitThread(来自主线程),退出,中止,从main返回,终止。
我想知道每个方法对静态/全局/自动对象销毁的影响。
例如,我有一个项目在调用ExitProcess时崩溃(可能是由于一些释放错误),但是在调用exit()时却没有。 (顺便提一下与this question有关)。
所以基本上我想知道在哪种情况下发生上述对象的释放,以及以什么顺序(对于VC ++)。
答案 0 :(得分:14)
简而言之:唯一安全的做法是允许main()
或您的主题功能return
。
C ++标准保证(3.6.3 / 1,18.3)在调用exit()
时将调用全局对象(包括静态对象)的析构函数,但它明确指出 local <的析构函数在这种情况下,/ em>变量将不被调用。 exit()
将调用在atexit()
注册的所有函数,并且还会刷新然后关闭所有打开的stdio流(至少包括stdin
,stdout
,stderr
)
保证调用abort()
不会调用本地或全局析构函数。它也不会调用用atexit()
注册的函数或刷新stdio流。
调用ExitProcess()
或ExitThread()
等任何Win32原语肯定不会为局部变量调用析构函数,并且几乎肯定不会为全局对象或使用{{1}注册的任何函数调用任何析构函数}。 不建议直接在C ++程序中调用这些函数 - 基本上,这些Win32函数和C ++运行时库对彼此一无所知。实际上,即使是MSDN documentation for ExitThread()
也建议C ++程序应该从线程函数返回而不是调用atexit()
。
(理论上,运行时库可能专门为ExitThread()
安排调用全局对象析构函数 - 这可以通过始终加载一个特定的DLL来完成,该入口点函数将执行这些调用,因为{{ 1}}将使用ExitProcess()
为每个加载的DLL调用入口点函数 - 但据我所知,没有实现这样做。)
答案 1 :(得分:-3)
请参阅ExitProcess()的源代码(发布在compuserve,usenet上)