1.假设有class A,new一个A的时候,在A的构造函数中抛出异常,那么此次new动态申请的内存会自动释放掉么?
系统会选择operator new 对应的operator delete来释放内存,如果找不到对应的operator delete,则内存泄露。
(详见effective c++ item 52)
2.默认情况下,new A的时候,如果内存不足,则抛出std::bad_alloc异常。如果写成new (std::nothrow) A,则在内存不足的情况下返回NULL,但是如果A的构造函数中又动态分配了内存,而此时恰好内存不足,我们没有办法强迫A的构造函数中再次使用nothrw new。没有运用nowthrow 的必要。
3.不要在析构函数中抛出异常(effective c++ item 08, more effectice c++ item11)
一是因为析构抛出异常的话,被析构的对象就没有完全被析构,不彻底。
而是因为如果同时存在两个异常,程序将会有不确性的行为,一般是终止。
4.构造某类的对象的时候,如果基类或者成员类的构造函数抛出异常,则这些异常必定会再次被抛出去,不管派生类的构造函数有没有处理这些异常,见如下代码:
class T
{
public:
T()
{
throw 1;
}
};
class BB
{
public:
T t;//使用一般的对象
BB()
try
{
}
catch(...)
{
cout<<"catched "<<endl;
}
};
class CC
{
public:
T *p;//使用指针
CC()
try
: p(new T())
{
}
catch(...)
{
cout<<"catched"<<endl;
}
};
void main()
{
CC c;//此处抛出异常
}
5.构造函数中阻止资源泄露(more effective c++ item 10)