《more effective C++》条款10 防止构造函数里的资源泄露
2015-11-15 23:56
375 查看
构造函数也可能发生内存泄露,考虑如下程序:
假设在do something 处抛出异常了,那么即使有析构函数,也是不会执行的。在构造函数没有执行完全的对象是不会自动调用析构函数的,因为析构函数并不知道构造函数执行到哪了,会不会做的事多余了。而当异常没有被及时捕获的话,就会产生泄露了,且会抛异常到调用构造函数的地方。
一个有用的方法是,将需要执行的部分先执行完,再抛出异常,并且及时捕获,再释放指针。大概类似如下模式:
如果类中定义了const成员呢?那就必须在构造函数的初始化表中直接初始化,而在此时出现异常了怎么办?有点难搞了,其实可以使用类似auto_ptr的对象来搞定,局部对象是肯定会被完好释放的。还有一种方法,初始化时是这样的A:X(X),Y(Y){}; 那么可以写一个成员函数,来代替X和Y,异常自然就可以在函数里处理了,但是这样的麻烦程度也增大了,为了初始化而已就开了两个函数来处理这些可能的异常。具体看P39.
class A { public: A(int *p) { if(p!=NULL) num=p; else p=new int(0); //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.
相关文章推荐
- 删除.cpp文件
- UML和模式应用书中C++版 NextGen POS代码
- java中数组和C语言数组的区别
- 一起talk C栗子吧(第六十回:C语言实例--字符串复制)
- C语言中可变参数的应用
- oc语言中的isa指针以及其面向对象语言的设计原理
- C++ && C 带空格的字符串输入
- c++单元测试指南:使用google test
- C语言关键字
- C语言的队列的初始化和先进先出的简洁程序
- C++ 定义类类型对象,默认构造函数,带有默认参数的构造函数
- C++学习笔记23——关联容器之set
- Dex动态加载的C语言部分
- 从初始化列表和构造函数谈C++的初始化机制
- VC++ CArchive及简单的文件操作方法
- c++(父类与子类,继承)
- C语言 scanf函数的机理和常规的格式字符串
- C++学习笔记22——关联容器之map
- C++中的friend友元函数详细解析
- [C++]小数转化为分数(class)