问题:
构造函数可以抛出异常么?析构函数可以吗?
从语法上来说,构造函数和析构函数都可以抛出异常。但从逻辑上和风险控制上,构造函数可以,析构函数不推荐抛出异常。(参见effective c++ 条款08 别让异常逃离析构函数)
1、构造函数可以抛出异常:
无论何时,从构造函数中抛出异常都是可以的。动态创建对象要进行两个操作:分配内存和调用构造函数。若在分配内存时出错,会抛出bad_alloc异常;若在调用构造函数初始化时出错,会不会存在内存泄漏呢?答案是不会。
new运算符保证不会出现内存泄漏:
T *p = new T;
将被编译器转换给类似下面的样子:
// 第一步,分配原始内存,若失败则抛出bad_alloc异常
try {
// 第二步,调用构造函数构造对象
new (p)T; // placement new: 只调用T的构造函数