《Effective C++第三版》读书笔记――资源管理

3 资源管理
~~~~~~~~~~~

3.1 以对象管理资源
===================
   1. 标准程序库提供的auto_ptr,其析构函数自动对所指对象调用delete.
 

  
  
  
  
  1. auto_ptr<T> pT(new T()); 



   2. 由于auto_ptr会自动删除所指之物,故一定别让多个auto_ptr指向同一对象,否则对象被删除多次的后果是未定义的.
      为了防止这个问题,auto_ptr有一个不同寻常的性质:若通过copy构造函数或copy assignment操作符复制它们,它们会变成null,而复制所得的指针将取得资源的唯一拥有权.
      由于STL容器要求元素发挥正常的复制行为,因此这些容器不能存auto_ptr
      auto_ptr的替代方案是引用计数型智慧指针(reference-counting smart pointer RCSP)
      例如TR1的tr1:shared_ptr
   3. auto_ptr和tr1::shared_ptr的析构函数内做的是delete而不是delete[]动作,故不能在动态分配的数组上使用auto_ptr和tr1::shared_ptr,不过数组基本上可以被vector所取代
   4. 以对象管理资源的两个关键想法是
      * 获得资源后立刻放入管理对象中
      * 管理对象运用析构函数确保资源被释放

3.2 在资源管理类中提供对原始资源的访问
=======================================
   1. tr1::shared_ptr和auto_ptr都提供一个get成员函数,会返回智能指针内部的原始指针.
   2. 可以通过显式提供get方法返回原始指针,
      也可以提供隐式转换函数的方法转型为原始指针
 

  
  
  
  
  1. class ResourceHandler{ 
  2.  public
  3.      operator Resource() const 
  4.      {return res;{ 
  5.  private
  6.      Resource res; 
  7.  } 



      但是这个隐式转换函数可能会使客户在需要使用ResourceHandler的地方错误地转换成为Resource

3.3 以独立语句将newd对象置入智能指针
=====================================
   1. 当构造函数是个explicit构造函数,无法进行隐式转换
   2. 像Func(ResourceHandler(new Resource),otherHandler)这样的语句,有可能获得的操作序列为new Resource,otherHandler,ResourceHandler(),
      由于在资源被创建(new Resource)和资源被转换为资源管理对象(ResourceHandler())之间的otherHandler可能发生异常干扰故而可能发生资源泄露.
      解决的办法就是分离语句,分别写出1.创建新资源并放入智能指针中(rh=ResourceHandler(new Resource)),2.将智能指针传入函数内(Func(rh,otherHandler)).

你可能感兴趣的:(C++,资源管理)