一、构造函数初始化列表的异常机制
class demo
{
public:
demo(int size)
try : _array(new int[size])
{
}
catch (bad_alloc&)
{
}
private:
int *_array;
};
假设在分配内存时发生了异常,并且被我们catch到,但是,这个异常仍然会继续向外抛,以让调用者知道。可以这么说,编译器在每个catch块的最后又为我们加了一行throw;因此,安全起见,在构造这个对象的代码处,还需再写一次try,catch。
try
{
demo obj;
}
catch (bad_alloc&)
{
}
二、构造函数体中的异常机制
把demo的构造函数代码改成这样:
demo(int size)
{
try
{
_array = new int[size];
}
catch (bad_alloc&)
{
}
}
天呐,这样构造函数就不会抛出异常了,但demo自己必须记录内存是否真的分配成功了。
另外,由于对象的构造可以分为两个步骤:分配内存和调用构造函数。构造函数抛出异常后,分配的内存会被自动回收。