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

Ass*_*vie 10 c++ winapi visual-c++

有多种退出流程的方法:

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

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

例如,我有一个项目在调用ExitProcess时崩溃(可能是由于一些释放错误),但是在调用exit()时却没有.(偶然地与这个问题有关).

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

j_r*_*ker 14

简而言之:唯一完全安全的做法是允许main()或者你的线程功能return.

C++标准保证(3.6.3/1,18.3)在调用时将调用全局对象(包括静态对象)的exit()析构函数,但是它明确指出在这种情况下不会调用局部变量的析构函数. 将调用与注册的任何功能,并且还冲刷和然后将关闭所有打开的标准输入输出流(包括至少,,).exit()atexit()stdinstdoutstderr

呼叫abort()保证不会调用本地或全局析构函数.它也不会调用注册的函数atexit()或刷新stdio流.

调用任何Win32原语,例如ExitProcess()ExitThread()肯定不会为局部变量调用析构函数,并且几乎肯定不会为全局对象或注册的任何函数调用任何析构函数atexit(). 不建议直接在C++程序中调用这些函数 - 基本上,这些Win32函数和C++运行时库对彼此一无所知.事实上,即使是MSDN文档也ExitThread()建议C++程序应该从线程函数返回而不是调用ExitThread().

(理论上,运行时库可能专门用于ExitProcess()调用全局对象析构函数 - 这可以通过始终加载一个特定的DLL来完成,该入口点函数将执行这些调用,因为ExitProcess()它将为每个加载的DLL调用入口点函数有DLL_PROCESS_DETACH- 但据我所知,没有实现这一点.)

  • 实际上,如果它们是在DLL中定义的,则ExitProcess会调用atexit注册的全局析构函数.它取决于对DLLMain(分离过程)的调用顺序.ExitProcess似乎首先分离DLL,然后尝试清理它自己的atexits,而exit()做相反的事情.因此,如果声明依赖于某些外部DLL的静态,则它们可能无法通过ExitProcess进行破坏.(这是基于我今天所做的一些实验.) (7认同)