在C ++中退出进程的不同方法

时间:2009-05-27 11:58:59

标签: c++ winapi visual-c++

有多种退出流程的方法:

例如:ExitProcess,ExitThread(来自主线程),退出,中止,从main返回,终止。

我想知道每个方法对静态/全局/自动对象销毁的影响。

例如,我有一个项目在调用ExitProcess时崩溃(可能是由于一些释放错误),但是在调用exit()时却没有。 (顺便提一下与this question有关)。

所以基本上我想知道在哪种情况下发生上述对象的释放,以及以什么顺序(对于VC ++)。

2 个答案:

答案 0 :(得分:14)

简而言之:唯一安全的做法是允许main()或您的主题功能return

C ++标准保证(3.6.3 / 1,18.3)在调用exit()时将调用全局对象(包括静态对象)的析构函数,但它明确指出 local <的析构函数在这种情况下,/ em>变量将被调用。 exit()将调用在atexit()注册的所有函数,并且还会刷新然后关闭所有打开的stdio流(至少包括stdinstdoutstderr

保证调用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上)