C++构造函数抛出的异常

要处理好C++构造函数抛出异常,的确是很tricky啊。

如果要分配在堆上,例如 T* p = new T(),则new operator会被异常中断,造成p没有被赋值。在离开构造函数的scope时,首先会析构自己的成员变量,并会递归调用父类的析构函数;不过,自己的析构函数是没有机会执行了,即便它被分配到栈上。唯一值得欣慰的是,为这个对象分配的内存,是会被释放掉的。

因此如果在构造函数中要分配一些资源,并且在执行过程中可能会抛出异常,最好用auto_ptr把它们保护起来。或者干脆不要在构造函数中执行复杂的初始化操作,转而定义一个单独的initialize方法 ...