exit(0)是否会在MFC中造成任何问题?

时间:2011-02-25 20:48:07

标签: c++ mfc

我想立即在C ++中退出我的MFC应用程序。退出(0)是最佳解决方案吗?例如。它是否可以防止析构函数被调用,它是否是线程安全的?等有更好的解决方案吗?感谢。

5 个答案:

答案 0 :(得分:6)

是的,exit(0)是最佳解决方案。它将导致全局对象(和函数内的static个对象)的析构函数运行,但是它不会导致堆栈分配或堆分配对象的析构函数运行:

// At global scope
ClassWithDestruct globalObject;

void SomeFunction()
{
    static ClassWithDestructor staticObject;
    ClassWithDestructor stackObject;
    ClassWithDestructor *heapObject = new ClassWithDestructor;

    // On the following call to exit(), the destructors of 'globalObject' and
    // 'staticObject' will run, but those of 'stackObject' and 'heapObject' will
    // NOT run
    exit(0);
}

至于它是否是线程安全的,这是一个难以回答的问题:你不应该同时从多个线程调用exit,你应该只调用一次。如果任何析构函数由于exit而运行,或者任何注册了atexit的函数运行,那么显然这些函数应该是线程安全的,如果它们处理可能被其他人使用的数据线程。

如果您的程序正常退出(例如,由于用户请求退出),您应该致电exit或从main / WinMain返回,这相当于致电exit。如果您的程序退出异常(例如,由于访问冲突或断言失败),您应该拨打_exitabort不要调用任何析构函数。

答案 1 :(得分:2)

如果您想立即退出 ,请确保不要事先运行任何析构函数等,那么您可能想要调用abort()。如果你想要执行析构函数,那么你可能想要使用PostQuitMessage(0);。不管怎样,exit()可能是错误的选择。

答案 2 :(得分:1)

当win32进程退出与之关联的任何资源时,操作系统会清理它,所以对我而言,这是完全可以的。

答案 3 :(得分:0)

退出(0)退出进程。清理所有内存。另一方面,明确管理的资源可能无法关闭。当然文件句柄将被关闭,Windows缓冲区中的东西将被刷新。然而,应用程序管理的东西不会。

答案 4 :(得分:0)

不,这不是一种安全的方式来结束你的程序。静态存储数据和非本地自动对象将被破坏,但本地自动对象不会。

从C ++标准的18.3 / 8开始:

  

函数exit()还有其他功能   这个国际的行为   标准:

     
      
  • 首先,具有静态存储的对象   持续时间被破坏和功能   通过致电atexit注册   调用。具有静态的非本地对象   存储时间被破坏[...]。   (自动对象不会被破坏   因为打电话   exit()。)[207])[...]一个本地静态   对象obj3同时被销毁   如果一个函数调用它将是时间   obj3析构函数已注册   atexit完成后   obj3构造函数。

  •   
  • 接下来,所有打开的C流(如   由功能签名介导   在<cstdio>)中声明未写入   刷新缓冲的数据,全部打开C   流已关闭,所有文件   通过调用tmpfile()创建的   移除。[209])

  •   
     

[207]:具有自动存储功能的对象   持续时间都被摧毁了   功能main()的程序   不包含自动对象和   执行对exit()的调用。控制   可以直接转移到这样的   main()抛出异常   陷入main()

     

[209]:任何与之关联的C流   刷新cincout等(27.3)   静态对象时关闭   在前一阶段被摧毁。该   函数tmpfile()在。中声明   <cstdio>


在相关的说明中,std::exit(EXIT_SUCCESS)令人不安地误导。