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