1 构造中的异常
- 构造过程立即停止,当前对象无法生成
- 析构函数不会被调用
- 对象所占用的空间立即收回
建议:不要在构造函数中抛出异常,当构造函数中可能产生异常时,使用二阶构造模式
编程实验:构造中的异常
// 49-1.cpp
#include<iostream>
using namespace std;
class Test
{
public:
Test()
{
cout << "Test()" << endl;
throw 0;
}
virtual ~Test()
{
cout << "~Test()" << endl;
}
};
int main()
{
Test* p = reinterpret_cast<Test*>(1);
try
{
p = new Test();
}
catch(...)
{
cout << "Exception" << endl;
}
cout << "p = " << p << endl;
return 0;
}
构造函数中抛出异常。类指针使用 reinterpret_cast 让其指向地址为 1 的内存。由于构造函数中抛出异常,所以构造过程立即停止,当前对象无法生成,析构函数不会被调用,对象所占用的空间立即收回
编译运行:
$ g++ 49-1.cpp -o 49-1
$ ./49-1
Test()
Exception
p = 0x1
可以看到 p 指针地址还是 1,也反应了对象没有生成。
下面我们证明一下对象所占用的空间立即收回,使用 valgrind 进行内存泄漏检测,如果内存被收回则不存在内存泄漏,由于没有 delete,如果没被收回则存在内存泄漏。
可以看到没有出现内存泄漏。
如果将第 10 行的 throw 0; 注释,就会出现内存泄漏,我们来检测一下,可以看到出现了内存泄漏。
2 析构中的异常
析构函数的异常将导致对象所使用的资源无法完全释放。所以要避免在析构函数中抛出异常。
3 小结
1、构造函数和析构函数中不要抛出异常