条款17:以独立语句将 new出来的对象置入智能指针

假设有一个函数来处理优先级,还有一个函数根据优先级对动态分配的Widget进行一些处理:

int priority();
void processWidget(std::shared_ptr<Widget> pw, int priority);
processWidget(new Widget, priority()); //错误,参数类型不匹配
processWidget(std::shared_ptr<Widget>(new Widget), priority());//正确

在调用processWidget之前,编译器必须生成代码来做以下三件事:

  • 调用priority函数。
  • 执行“new Widget”。
  • 调用shared_ptr的构造函数。

由于编译器的不同,语句的调用顺序可能不同,可能出现的情况:

  1. 执行“new Widget”。
  2. 调用priority函数。
  3. 调用shared_ptr的构造函数
    如果在执行priority函数出现异常,由于我们已经进行动态内存分配了,而且该内存并没有进行管理,所以泄露了。
    避免这种问题的方法很简单:使用一个单独的语句创建Widget并将其存储在一个智能指针中,然后将智能指针传递给processWidget:
std::shared_ptr<Widget> pw(new Widget); // 在独立语句中,
					    //将新对象存储在智能指针中
processWidget(pw, priority()); // 这个调用不会发生泄漏

 在独立语句中将新对象存储在智能指针中。如果不这样做,在抛出异常时可能会导致微妙的资源泄漏。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值