您的位置:首页 > 编程语言 > C语言/C++

《Effective C++》重点摘要(三)

2015-04-21 10:20 127 查看

《Effective C++》第三章:资源管理

以对象管理资源。一份资源,可能是一片内存,可能是一个锁,当客户申请后需要手动释放才是合理的,那么最好在获得这份资源的时候,就立刻把它放到一个对象里(RAII技术),然后在对象的析构函数里释放它。这样释放操作就不会被遗忘了,并且,就算在使用资源类的语境中有语句抛出异常,也能确保资源得到正确的释放。

在资源管理类中小心coping行为。有的资源是不支持copy语义的,而有的资源需要深拷贝语义,有的资源支持控制权转移语义,还有的资源是支持引用计数的,所以copying操作要格外小心。应该了解一下C++98里智能指针(shared_ptr和auto_ptr)的copy语义,特别是auto_ptr。而C++11里,auto_ptr已经被废除了,但是引入了另外两个更亲和的智能指针——weak_ptr和unique_ptr。

在资源管理类中提供对原始资源的访问。虽然这样不符合封装的思想,但是为了兼容老旧的借口,有时候不得不访问原始资源。可以使用隐式转换方式访问原始资源,也可以使用明确获取的原始资源的访问权,两种方法各有优劣,隐式转换让使用者视觉更舒服,但是显式获取更能表达使用者的意图,如果可以,尽量用显式获取吧。

成对使用new和delete时要采取相同的形式。如果type *p = new type,那么请使用delete p;如果type *p = new type[count],那么请使用delete []p。理由是delete操作符只处理p指向的位置上的第一个合法对象,而delete []确保处理p指向的位置中存放的所有合法对象。但这不是说可以用delete []处理 new type得到的指向单一对象的指针,因为有的编译器把 new type[]得到的之前之前的几个字节放置了该指针后合法对象的个数!!!所以使用delete []处理new type得到的指针更危险!!!请保持对称。

以独立语句将newed对象置入智能指针。以智能指针作为函数实参时,不要使用这样的形式someFunc(shared_ptr(new Type),otherFunc()),虽然C++保证someFunc执行前它的参数都会估值完毕,但是却没有强制规定估值顺序,所以,如果先执行了new Type,然后执行otherFunc,而后者抛出了异常,那么new Type申请的内存就不会被释放,因为shared_ptr还没来得及调用构造函数呢,自然不会执行其析构函数,于是内存泄露,所以,需要先shared_ptr pw(new Type),然后在调用someFunc(pw,otherFunc())。此即以独立语句将newed对象置入智能指针之意。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: