Effective C++ 条款17:以独立语句将newd的对象放进智能指针

以独立语句将new出来的对象存储于智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露

  processWidget(shared_ptr<Widget> (new Widget),priority());
  执行分两部分:
  1.new Widget;
  2.调用shared_ptr的构造函数
  3.调用priority()
  但是由于C++语言的取参数的次序弹性大,无法总是以特定次序进行,
  所以当出现
   1.new Widget;
   2.调用priority;
   3.调用shared_ptr的构造函数
   如果调用priority失败抛出异常
   则new出来的资源将会无对象支配导致资源泄露。
   所以一个良好的解决方法是:
   shared_ptr<Widget> pw(new Widget);在单独语句内以智能指针存储new来的对象
   processWidget(pw,priority);这样才不会导致资源泄露


   补充:之所以这样行得通,因为编译器对于“跨越语句的各项操作”没有重新排列的自由
   (只有在语句内它才有那样的自由度)。在上述修订后的代码内,“new Widget”表达式以及
   对“对shared_ptr构造函数的调用”这两个动作,和“对priority的调用”是分隔开来的,
   位于不同语句内,所以编译器不得在它们之间任意选择执行次序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值