Effective C++ 第三章——资源管理

介绍了条款13~17

Posted on May 3, 2017 in Effective_Cpp, ReadBook


条款13:以对象管理资源
条款14:在资源管理类中小心copying行为
条款15:在资源管理类中提供对原始资源的访问
条款16:成对使用的new和delete时采用相同的形式
条款17:以独立语句将newed对象置入智能指针



条款13:以对象管理资源

P62 即使你记得释放资源,在资源的申请与释放之间,若程序出现问题也会出现资源泄露的现象。所以最好将资源放进对象内,当控制流离开对象所在的作用域就会通过析构函数进行资源的释放(依赖C++的“析构函数自动调用机制”) 
P63 “以对象管理资源”RAII 
获得资源后立刻放进管理对象内,在获得一笔资源后于同一语句内以它初始化某个管理对象。 
管理对象运用析构函数确保资源被释放。若遇上析构出现异常就参考条款8构造/析构/赋值运算 
P63 对这个对象的实现,从auto_ptr(or unique_ptr禁止copy)到shared_ptr。因为他们就是典型的heap资源上的RAII了。

条款14:在资源管理类中小心copying行为

上一个条款是说明heap-based资源的RAII实现(智能指针等),对于非heap-based资源,可能需要自己实现资源管理类,如互斥锁。 
P67 资源类被复制,怎么办? 
禁止复制,参考条款6构造/析构/赋值运算 
对类内的资源句柄(通常是一个private对象)使用“引用计数法”,就是采用智能指针。注意不是资源管理类本身,而是类内的资源对象。通过这样做,往往需要定义一下资源的删除器P68 
P68 考虑一下这几个问题:是否需要对资源进行深度的复制?是否需要保持只有一个RAII对象指向资源(auto指针,unique指针)?是否需要自定义资源管理类的拷贝行为。

条款15:在资源管理类中提供对原始资源的访问

若资源管理类如条款13所示的使用智能指针实现,那么当有些地方需要资源的raw pointer的时候应该怎么办?!智能指针提供了显式的转换函数get,通过-> or operator* 还能进行隐式转换呢 
P70-71 那么对于自己实现的资源管理类,就需要想想是否提供显式转换get函数,或者隐式转换P71 
一般显式转换比较安全

条款16:成对使用的new和delete时采用相同的形式

P73 一个对象被new出来,通常先用operator new申请内存,然后执行构造函数进行初始化;当执行delete时,也是先执行析构函数再进行operator delete。于是乎就必须对应申请了多少内存,执行了多少构造就得进行多少析构以及回收资源,所以new对delete , new[]对delete[]。 
注意:

在多个构造函数中采用同样形式的new,以便在析构函数中方便使用delete

typedef不要对数组进行

条款17:以独立语句将newed对象置入智能指针

就是说智能指针的声明与初始化在独立的一条语句内被执行,不要放置在其他语句内一并执行,因为这各初始化动作分为①new出对象,然后②初始化智能指针,不要打断这个过程。 
智能指针的初始化参看 25、智能指针的使用