C++11会默认将类的析构函数声明为noexcept,不允许抛出异常,这是什么原因呢?
#include <stdio.h>
class A{
public:
A(){}
~A()
{
printf("~A %d\n", m_num);
}
int m_num;
};
void func()
{
A a[10];
for(int i = 0; i < 10; ++i)
{
a[i].m_num = i;
}
throw(100);//抛出异常,开始析构数组a[10]中的每个对象
printf("after throw 100\n");//由于有异常被抛出,程序的执行流变化,不会执行到这条语句
}
int main()
{
try{
func();
}
catch(int a){
printf("main catch a except %d \n", a);
}
return 0;
}
程序会倒叙释放数组中的每个对象,然后在main函数里捕捉到异常,执行输出为:
~A 9
~A 8
~A 7
~A 6
~A 5
~A 4
~A 3
~A 2
~A 1
~A 0
main catch a except 100
但如果允许析构函数抛出异常:
#include <stdio.h>