问题1:
如果在main函数中抛出异常,结果会怎么样?
include <iostream>
using namespace std;
class Test
{
public:
Test()
{
cout << "Test()";
cout << endl;
}
~Test()
{
cout << "~Test()";
cout << endl;
}
};
int main()
{
static Test t;
throw 1;
return 0;
}
结果是程序异常终止并退出(但是不同编译器环境下结果不同)
terminate()
{
// exit(1);
// abort();
// ...
}
//这个函数内部还可以做其他事情(解释为什么不同编译器有不同效果)
exit(1)
//确保静态变量 全局对象的被析构。资源要释放
abort()
//等不到资源释放就退出
terminate()函数的替换:
void my_terminate()
{
cout << "void my_terminate()" << endl;
exit(1);
// abort() 默认的情况下是这个函数,这也是设计库的时候考虑的
}
class Test
{
public:
Test()
{
cout << "Test()";
cout << endl;
}
~Test()
{
cout << "~Test()";
cout << endl;
}
};
int main()
{
set_terminate(my_terminate);
static Test t;
throw 1;
return 0;
}
程序调用我们自己定义的 my_terminate() 函数.
问题2:
析构函数中抛出异常发生什么情况?
不允许在析构函数里面扔出异常
1.析构函数是用来释放资源的地方,如果抛出异常,那么资源可能得不到正常的释放。
2.有可能导致全局的函数 terminate() 函数重复的调用,非常可怕,会使系统进入不稳定的状态。
小结:
1.如果异常没有被处理,最后 terminate() 结束整个程序,它是整个程序释放资源的最后机会
2.结束函数可以自定义,但是不能抛出异常
3.析构函数不能抛出异常,可能会导致 terminate() 多次调用。