码迷,mamicode.com
首页 > 编程语言 > 详细

Effective C++ —— 资源管理(三)

时间:2015-09-12 18:59:20      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

条款13 : 以对象管理资源

  假设有如下代码:

Investment* createInvestment();   //返回指针,指向Investment继承体系内的动态分配对象,调用者有责任删除它

void func()
{
    Investment* pInv = createInvestment();   //调用factory函数
    .....
    delete pInv;      //释放pInv所指对象
}

  上述代码可能出现如下问题导致无法删除pInv指针所指对象,出现资源泄露。

  (1)“.....”区域内一个过早结束的return语句;

  (2)delete动作位于某个循环内,而该循环由于某个continue或goto语句过早结束;

      (3)“.....”区域内语句抛出异常;

解决方案:把资源放进对象内,我们便可倚赖C++的“析构函数自动调用机制”确保资源被释放。标准程序库提供的auto_ptr正是针对这种形势而设计的特制产品。auto_ptr是个“类指针(pointer-like)对象”,也就是所谓“智能指针”,其析构函数自动对其所指对象调用delete。如下:

void func()
{
    std::auto_ptr<Investment> pInv (createInvestment());
    .....   // 调用factory函数,经由auto_ptr的析构函数自动删除pInv
}

解析:

  1. 获得资源后立刻放进管理对象内。实际上,“以对象管理资源”的观念常被称为“资源取得时机便是初始化时机”(Resource Acquisition Is Initialization;RAII)。每一笔资源都在获得的同时立刻被放进管理对象中
  2. 管理对象运用析构函数确保资源被释放。即便析构抛出异常,条款08也已经给出解决方案。

这里简单介绍一下“智能指针”:

  auto_ptr采用“所有权”方式管理对象,也即对于auto_ptr的赋值、复制操作将直接交割对象的所有权,所以一定注意不要让多个auto_ptr同时指向同一个对象。

  auto_ptr的替代方案是“引用计数型智慧指针”(reference-counting smart pointer;RCSP),其也是一个智能指针,持续追踪共有多少对象指向某笔资源,并在无人指向它时自动删除该资源。TR1的tr1::shared_ptr(条款54)就是个RCSP。上述代码可修改如下:

void func()
{
    .....
    std::tr1::shared_ptr<Investment> pInv (createInvestment());
    .....   // 调用factory函数,经由shared_ptr的析构函数自动删除pInv
}

注:上述auto_ptr和tr1::shared_ptr只不过是“以对象管理资源”在本条款中所使用的例子。同时,createInvestment返回“未加工指针”(raw pointer)简直是对资源泄漏的一个死亡邀约,其一,调用者极易在这个指针身上忘记调用delete;其二,即使想使用智能指针,也有可能会忘记将createInvestment的返回值存储于智能对象内。所以,条款18提供了一个解决方法:令createInvestment返回一个智能指针。如:

std::tr1::shared_ptr<Investment> createInvestment();

这便强迫客户将返回值存储于一个tr1::shared_ptr内。

故而:

  1. 为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。

  2. 两个常被使用的RAII classes分别是auto_ptr和tr1::shared_ptr。后者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向Null。

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

  假设有如下代码

 

 

 

 

 

 

 

编译器可以暗自为class创建default构造函

 

 

 

 

 

 

 

 

Effective C++ —— 资源管理(三)

标签:

原文地址:http://www.cnblogs.com/yyxt/p/4803312.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!