出口(0)在MFC中是否存在任何问题? 我想立即退出C++中的MFC应用程序。退出(0)是最佳解决方案吗?它是否阻止调用析构函数,是否线程安全?还有更好的解决方案吗?谢谢。

出口(0)在MFC中是否存在任何问题? 我想立即退出C++中的MFC应用程序。退出(0)是最佳解决方案吗?它是否阻止调用析构函数,是否线程安全?还有更好的解决方案吗?谢谢。,c++,mfc,C++,Mfc,当win32进程退出时,与它相关的任何资源都会被操作系统清除,因此对我来说,这是完全正常的。退出(0)退出进程。所有的内存都被清除了。另一方面,显式管理的资源可能不会关闭。当然,文件句柄将被关闭,windows缓冲区中的内容将被刷新。但是,应用程序管理的内容不会。是的,退出(0)是最好的解决方案。它将导致全局对象(和函数中的静态对象)的析构函数运行,但不会导致堆栈分配或堆分配对象的析构函数运行: // At global scope ClassWithDestruct globalObject;

当win32进程退出时,与它相关的任何资源都会被操作系统清除,因此对我来说,这是完全正常的。

退出(0)退出进程。所有的内存都被清除了。另一方面,显式管理的资源可能不会关闭。当然,文件句柄将被关闭,windows缓冲区中的内容将被刷新。但是,应用程序管理的内容不会。是的,
退出(0)
是最好的解决方案。它将导致全局对象(和函数中的
静态
对象)的析构函数运行,但不会导致堆栈分配或堆分配对象的析构函数运行:

// 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
或从
main
/
WinMain
返回,这相当于调用
exit
。如果您的程序异常退出(例如,由于访问冲突或断言失败),您应该调用
\u exit
abort
,这不会调用任何析构函数。

不,这不是结束程序的安全方法。静态存储数据和非本地自动对象将销毁,但本地自动对象不会销毁

< > C++标准中的18.3/8:

函数
exit()
在这个国际社会中的行为
标准:

  • 首先,使用静态存储的对象 持续时间和功能被破坏 通过调用atexit注册的是 打电话。具有静态特性的非局部对象 存储时间被销毁[…]。 (自动对象不会被销毁 由于打电话
    exit()
    对象
    obj3
    同时被销毁 如果函数调用 已注册
    obj3
    析构函数 在完成测试时使用
    atexit
    obj3
    构造函数

  • 接下来,所有打开的C流(如 以函数签名为中介 在
    )中声明,但未写入 缓冲数据被刷新,全部打开C 流关闭,所有文件 通过调用
    tmpfile()
    创建的 删除[209])

[207]:具有自动存储功能的对象 持续时间在一个时间段内全部销毁 其函数
main()
不包含自动对象和 执行对
exit()
的调用。控制 可以直接转移到这样一个
main()
被捕获在
main()

[209]:与
cin
cout
等(27.3)被刷新 并在静态对象处于活动状态时关闭 在前一阶段被摧毁。这个 函数
tmpfile()
在中声明



与此相关的一点是,
std::exit(exit_SUCCESS)
令人不安地具有误导性。

如果您想立即退出,确保事先不运行任何析构函数等,那么您可能需要调用
abort()
。如果您确实希望执行析构函数,那么您可能希望使用
PostQuitMessage(0)。无论哪种方式,
exit()
都可能是错误的选择。

Windows清理弹片。当然不是一半的书面文件。更好的解决方案是不需要这样做。