代码之家  ›  专栏  ›  技术社区  ›  Assaf Lavie

C++中退出进程的不同方式

  •  10
  • Assaf Lavie  · 技术社区  · 16 年前

    退出流程有多种方式:

    例如:exitprocess、exit thread(从主线程)、exit、abort、return from main、terminate。

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

    例如,我有一个项目在调用exitprocess时崩溃(可能是由于某些释放错误),但在调用exit()时不会崩溃。(有关) this question 顺便说一下)。

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

    2 回复  |  直到 16 年前
        1
  •  14
  •   j_random_hacker    16 年前

    简而言之: 唯一完全安全的做法是允许 main() 或您的线程函数,以 return .

    C++标准保证(3.63/1,18.3)对于全局对象(包括静态对象)的析构函数将被调用。 exit() 但它显式地声明 地方的 变量将 在这种情况下被调用。 退出() 将调用在中注册的任何函数 atexit() ,还将刷新并关闭任何打开的stdio流(至少包括 stdin , stdout , stderr )

    打电话 abort() 保证不会调用本地或全局析构函数。它也不会调用注册的函数 ATEXIT() 或者刷新stdio流。

    调用任何win32基元,如 ExitProcess() ExitThread() 当然不会为局部变量调用析构函数,而且几乎肯定不会为全局对象调用任何析构函数,也不会调用在中注册的任何函数。 ATEXIT() . 不建议在C++程序中直接调用这些函数。 ——基本上,这些Win32函数和C++运行时库彼此一无所知。事实上,即使是 MSDN documentation for ExitThread() 建议C++程序应该从线程函数返回而不是调用 ExthTHead() .

    (理论上,运行库有可能专门为 退出进程() 调用全局对象析构函数——这可以通过始终加载一个特定的dll来完成,该dll的入口点函数将执行这些调用,因为 退出进程() 将调用每个加载的dll的入口点函数 DLL_PROCESS_DETACH --但是据我所知,没有实现能做到这一点。)

        2
  •  -3
  •   Joh    16 年前

    请参见exitprocess()的源代码(发布在computeserve、usenet上)