第三章、资源管理

条款13、以对象管理资源(Use objects to manage resources)

  1. 放资源放入对象进行管理,就可以利用C++的析构函数自动调用机制来释放资源。
  2. 以对象管理资源时,需要注意两点:第一、获得资源后立即放入管理对象中。第二、管理对象需要运用析构对象确保资源可以被释放。

实际上,以对象管理资源的观念常被称为“资源取得时机就是初始化时机”(Resource Acquisition Is Initialization;RAII),因为我们几乎总是在获得一笔资源后同一语句内以它初始化某个管理对象。有时会使用赋值操作将其赋予管理对象,但不论是哪种方式,每一笔资源都在获得的同时立即放进管理对象中。

  1. 对于引用计数型智慧指针(reference-counting smart pointer;RCSP)tr1::shared_ptr而言,它会在析构函数中默认执行delete操作而不是delete[],如果你需要管理动态分配的array,你需要给它一个合适的删除器,或者不要使用它。

条款14、在资源管理类中小心copying行为(Think carefully about copying behavior in resource-managing classes)

  1. 对于RAII对象,当它被复制时,经常有以下选择:第一、禁止复制。第二、对底层资源使用引用计数法进行管理。第三、复制底部资源。第四、转移底部资源的拥有权。
  1. 许多时候允许RAII对象被复制是不合理的,此时我们应禁止编译器生成copying函数。
  2. 对于需要底部资源可以被拷贝的情况,应该进行“深度拷贝”。

条款15、在资源管理类中提供对原始资源的访问(Provide access to raw resources in resource-managing classes)

  1. 很多APIs或者操作经常需要直接指涉原始资源,所以每一个RAII class应该提供一个可以获取原始资源的办法。
  2. RAII classes并不是为了封装某物而存在,而是为了保证资源释放一定会发生。
  3. 对原始资源的访问可以通过显式转换或者因式转换来完成。一般来说,显式转换比较安全,而隐式转换对于使用比较方便。

条款16、成对使用new和delete时要采取相同形式(Use the same form in corresponding uses of new and delete)

  1. 当你使用new时,有两件事情会发生:第一、通过名为operator new的函数将内存分配出来。第二、针对此内存会有一个或者更多的构造函数被调用。当你使用delete时,也有两件事情会发生:第一、针对此内存会有一个或多个析构函数被调用。第二、通过operator delete的函数将内存释放。
  2. 在使用new或者delete时,如果其后紧跟一个中括号,则操作对象是一个数组,否则则是一个对象。
  3. 对于动态生成的对象而言,如果你调用new时使用了**[ ],那么在delete时也应该使用[ ]**。
  4. 尽量不要对需要动态分配的数组类型做typedefs的动作,因为这很容易让人产生误会,导致释放时使用错误形式的delete

条款17、以独立于巨将newed对象置入智能指针(Store newed objects in smart pointers in standalone statements)

  1. 对于C++而言,对于复合语句的个别部分,有可能没有明确的执行顺序,所以应尽量以独立语句将资源传递给RAII对象,如果不这样做,有可能出现由于异常被抛出而导致难以察觉的资源泄露。

例如processWidget(std::tr1::shared_ptr< Widget >(new Widget), priority());
在此语句中,可以确定的是new Widget一定早于std::tr1::shared_ptr< Widget >的构造函数前被执行,但对于其他部分,C++未定义明确的执行顺序。如果以如下顺序执行:

  1. new Widget
  2. priority()
  3. std::tr1::shared_ptr< Widget >构造函数
    如果在priority()函数的执行期间出现异常,则new Widget返回的指针将会丢失,因为它尚未被放入shared_ptr中,这将导致资源泄露。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值