假设我有以下代码:
struct mytype
{
~mytype() { /* do something like call Mix_CloseAudio etc */ }
};
int main()
{
mytype instant;
init_stuff();
start();
return 0;
}
即使从 start() 内部的某个地方使用 exit() ,是否保证调用该析构函数?
假设我有以下代码:
struct mytype
{
~mytype() { /* do something like call Mix_CloseAudio etc */ }
};
int main()
{
mytype instant;
init_stuff();
start();
return 0;
}
即使从 start() 内部的某个地方使用 exit() ,是否保证调用该析构函数?
如果您调用exit
,则不会调用析构函数。
来自 C++ 标准(§3.6.1/4):
调用函数
void exit(int);
(18.3)中声明的
<cstdlib>
终止程序而不离开当前块,因此不会破坏任何具有自动存储持续时间的对象 (12.4)。如果在销毁具有静态存储持续时间的对象期间调用 exit 来结束程序,则程序具有未定义的行为。
是的,调用 exit() 意味着不会调用析构函数:
调用函数 void exit(int); (18.3)中声明的
<cstdlib>
终止程序而不离开当前块,因此不会破坏任何具有自动存储持续时间的对象 (12.4)。如果在销毁具有静态存储持续时间的对象期间调用 exit 来结束程序,则程序具有未定义的行为。
另一方面,如果抛出异常,则将调用析构函数。这是 C++ 中异常安全的基础。
只要程序中的某些东西捕获了异常,异常就会调用析构函数。如果异常退出 main() 函数而没有被捕获,则标准不需要运行时展开堆栈以进行清理。
用一个
try{
// code
}catch(...){ //that elipsis should actually appear in your code
//it doesn't mean I omitted code here.
//code
}
在您的main()
函数中将保证捕获每个异常,并调用所有析构函数。