Effective C++读书笔记3(资源管理)

来源:互联网 发布:centos 7硬盘安装 编辑:程序博客网 时间:2024/06/10 02:47
◆条款13  以对象管理资源
以对象管理资源,可以在释放对象时经由析构函数来释放该对象所占用的资源,经此来防止内存泄漏。根据这原则,获得资源后立刻放进管理对象。⇒RAII("Resource Acquisition IS Initialization.")
可以用智能指针来防止忘记delete,但STD的auto_ptr的复制行为很奇怪,复制的源会被置为NULL,BOOST的shared_ptr则没有这个问题。

◆条款14  在资源管理类中小心coping行为
有些在资源管理类中被管理的资源在拷贝(拷贝构造函数,拷贝赋值函数)后可能呈现出意想不到的结果,比如管理一个锁,拷贝时就又加了一次锁,所以需要小心考虑两个拷贝函数的实现。可以通过禁止拷贝或者对资源使用进行计数来管理此类资源。

◆条款15  在资源管理类中提供对原始资源的访问
经常需要直接访问一个资源管理类管理的原始资源,可以通过提供一个get方法,或者经由隐式类型转换来实现,一般来说前者较安全。

◆条款16  成对使用new和delete要采取相同形式
new出来的数组delete时要用delete [ ],所以最好尽量不要对数组形式做typedef动作,因为很可能忘记它的数组属性。

◆条款17  以独立语句将newed对象置入智能指针
智能指针的初始化必须放在单独语句中执行,尤其不能放在函数参数里作为参数来初始化,因为有可能别的参数异常导致该指针无法释放。

这五个条款中心思想是将资源纳入类的管理范围内来,以此来管理资源的初始化和释放过程,其中析构函数扮演了很重要的角色,因为析构函数永远都会被最后调用的。智能指针也可以管理这些资源,但是效率会差一点,看如何平衡了,从项目经验上来看,制定一套不依赖编译器的编程法则或许也是不错的方式,看起来很高明的设计往往会很难看懂,太依赖于程序员的能力。而编程法则能很简单的由Review时同事指出问题。

★大的项目里可以定制一整套内存使用法则,建立能控制heap内存的管理类,其实就是定制new和delete。

原创粉丝点击