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