版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liunan199481/article/details/82020771
资源管理
资源概述
- c++中最常见的资源就是内存资源,管理不好内存资源容易造成内存泄漏。
- 其它常见资源有:**文件描述器、互斥锁、图形界面中的字体和笔刷、数据库链接、网络socket等。
条款13:用对象管理资源
- 首先先理解几个常识:
- c++中普通的对象是存放在栈中的,当对象离开作用域,对象析构函数被调用
- c++中new出来的对象是放在堆上的,如果不适用delete,它不会自动调用析构函数
- 鉴于以上2点,我们又得出结论:若一个对象中有指针成员,指针指向的对象是new出来的,我们要在它的析构函数内delete掉指针成员指向的对象;对于这个对象,若它是类直接实例化的,参考1;若它是new出来的,参考2.
- 书中的使用对象来管理资源也就大概是这个意思。
- 为了实现程序自动管理资源,数组推荐智能指针,因为它可以自动delete。
- 由于delete的特性,所以不能有2个智能指针指向同一个对象,因为会delete掉2次。
- auto_ptr=>智能指针,但是它不支持指针指针间的赋值,赋值之后赋值的指针会变成null,被赋值者指向原来对象,但是这刚好保证了,赋值不会产生2个指针指向一个对象,但是如果让2个智能指针指向同一个对象还是可以的。
- shared_ptr=>比auto_ptr高级一点,基于引用次数实现的(RCSP),指针间赋值和auto_ptr不一样。
- 总结:
- 使用RAII对象进行资源管理,在构造函数中申请资源,在析构中释放资源。
- 常见的RAII CLASSES有:auto_ptr和shared_ptr,后者copy行为更直观,推荐使用后者。
条款14:在资源管理类中,小心copy行为
- copy RAII对象,连其管理的资源一起copy
- 常见的RAII classes coping行为有:抑制coping、施行引用计数法
条款15:在资源管理类中提供对原始资源的访问
- 不用担心,shared_ptr和auto_ptr都有一个get函数,可以返回内部的原始指针。这是显式转换
- shared_ptr和auto_ptr重载了operator->和operator*,所以他们也具有隐式转换。
- 自己设计RAII CLASS需要遵循的原则:
- 提供访问原始资源的办法
- 对原始资源的访问可以使用显示转换和隐式转换。
条款16:new和delete使用相同形式
new | delete |
---|---|
new [] | delete[] |
条款17:以独立语句将new出的对象置于智能指针中
- 不能在符合语句中,进行上面的操作,比如,不能再函数调用中将new的对象存储于智能指针中,有异常,可能造成内存泄漏。