构造函数也可能发生内存泄露,考虑如下程序:

 class A
{
public:
A(int *p)
{
if(p!=NULL) num=p;
else p=new int();
//do something
}
private:
int *num;
};

  假设在do something 处抛出异常了,那么即使有析构函数,也是不会执行的。在构造函数没有执行完全的对象是不会自动调用析构函数的,因为析构函数并不知道构造函数执行到哪了,会不会做的事多余了。而当异常没有被及时捕获的话,就会产生泄露了,且会抛异常到调用构造函数的地方。

  一个有用的方法是,将需要执行的部分先执行完,再抛出异常,并且及时捕获,再释放指针。大概类似如下模式:

 class A
{
public:
A()
{
try{
//do something1
//do something2
}
catch(...){
delete x1;
delete x2;
throw;
}
}
};

  如果类中定义了const成员呢?那就必须在构造函数的初始化表中直接初始化,而在此时出现异常了怎么办?有点难搞了,其实可以使用类似auto_ptr的对象来搞定,局部对象是肯定会被完好释放的。还有一种方法,初始化时是这样的A:X(X),Y(Y){}; 那么可以写一个成员函数,来代替X和Y,异常自然就可以在函数里处理了,但是这样的麻烦程度也增大了,为了初始化而已就开了两个函数来处理这些可能的异常。具体看P39.

《more effective C++》条款10 防止构造函数里的资源泄露的更多相关文章

  1. Effective C++ -----条款13:以对象管理资源

    为防止资源泄漏,请使用RAII(Resource Acquisiton Is Initialization) 对象,它们在构造函数中获得资源并在析构函数中释放资源. 两个常被使用的RAII class ...

  2. Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为

    三.资源管理       资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket ...

  3. effective c++ 条款10 handle assignment to self operator =

    非强制性,但是个好习惯 当使用连锁赋值时很有用 x=y=z=10; class Window { public: Window& operator=(int size) { ... retur ...

  4. Effective C++ 条款10

    令operator=返回一个reference to *this 将operator=返回一个reference是为了什么呢?答案很简单,就是为了实现连锁形式. 什么是连锁形式,如int x,y,z: ...

  5. Effective C++ -----条款10: 令operator=返回一个reference to *this

    比如: Widget& operator=(const Widget& rhs) { ... return* this; } 令赋值(assignment)操作符返回一个referen ...

  6. Effective C++ 条款10:令operator= 返回一个reference to *this

    class Widget { public: ... Widget& operator+=(const Widget& rhs) // 返回类型是个reference,指向当前对象 { ...

  7. EC读书笔记系列之5:条款9、条款10

    条款9 绝不在构造和析构过程中调用virtual函数 记住: ★在构造和析构期间不要调用virtual函数,∵这类调用从不下降至derived class ---------------------- ...

  8. 10.C++-构造函数初始化列表、类const成员、对象构造顺序、析构函数

    首先回忆下,以前学的const 单独使用const修饰变量时,是定义的常量,比如:const int i=1; 使用volatile const修饰变量时,定义的是只读变量 使用const & ...

  9. [More Effective C++]条款22有关返回值优化的验证结果

    (这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...

随机推荐

  1. jquery.query.js 插件的用法

    转载自:http://www.cnblogs.com/dachie/archive/2010/09/16/1827840.html 代码如下: var url = location.search; & ...

  2. SVN删除同名文件夹

    解     释一下:     SVN  出现这个错误的原因是我删除了一个文件夹后又创建了一个同名文件夹.  在  svn   server  端,好像是不能区分这两个文件夹,所以出现了错误.     ...

  3. Oracle 中的 decode

    含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN R ...

  4. Java:标示符 基本数据类型

    标示符: 在程序中自定义的一些名称,例如:变量.类名.方法名…… 组成有数字0~9.大小写英文字母.“$”和下划线“_”组成,且不能由数字开头,以及不能使用java已使用和保留的关键字. Java中的 ...

  5. qml 相关的博客

    http://qt-project.org/wiki/SpaceAppsChallengeResources http://www.ics.com/blog https://www.ics.com/d ...

  6. 关于linux服务器的批量维护、批量升级、

    由于版权费用原因,众多中小服务器采用linux服务器进行功能处理.在进行批量升级.更新业务程序时.可以采用如下批量方案: 1.打包成rpm包,并配置yum源服务器,以支持个人的yum服务器进行处理.一 ...

  7. HTML元素,属性,基础标签

    元素,属性 元素 html有父元素和子元素,被包含的叫子元素,如html是head的父元素,他们是父子关系,head和body是兄弟关系 <html> <head></h ...

  8. js 数组去除空值

    for(var i = 0 ;i<wordarr.length;i++)                {                    if(wordarr[i] == "& ...

  9. ubuntu连接Android调试

    从这周开始尝试Android开发,记下点滴. 安装JDK.下载ADT不说,连接手机调试的时候出错,一堆问号??????????.网上一查,属于典型错误.试下来,有几步比较关键,容易忽视: 1.我机器上 ...

  10. HDU 4085 斯坦纳树

    题目大意: 给定无向图,让前k个点都能到达后k个点(保护地)中的一个,而且前k个点每个需要占据后k个中的一个,相互不冲突 找到实现这个条件达到的选择边的最小总权值 这里很容易看出,最后选到的边不保证整 ...