《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)).

本文出自 “暗日” 博客,请务必保留此出处http://darksun.blog.51cto.com/3874064/1144746

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值