构造,析构,异常处理

来源:互联网 发布:程序员看不懂英文文档 编辑:程序博客网 时间:2024/06/05 21:02

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) 

原创粉丝点击