我想立即在C ++中退出我的MFC应用程序。退出(0)是最佳解决方案吗?例如。它是否可以防止析构函数被调用,它是否是线程安全的?等有更好的解决方案吗?感谢。
答案 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
。如果您的程序退出异常(例如,由于访问冲突或断言失败),您应该拨打_exit
或abort
,不要调用任何析构函数。
答案 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流 刷新
cin
,cout
等(27.3) 静态对象时关闭 在前一阶段被摧毁。该 函数tmpfile()
在。中声明<cstdio>
。
在相关的说明中,std::exit(EXIT_SUCCESS)
令人不安地误导。