Effective C++ 条款17 以独立语句将newed对象置入智能指针

1. 有些智能指针类(比如shared_ptr<T>)不支持隐式类型转换,假设存在这样两个函数:

void fun(shared_ptr<int> lhs,int rhs);
int foo();
View Code

那么对于以下函数调用:

fun(new int,foo());

将不能通过编译,解决方法之一:

fun(shared_ptr<int>(new int),foo());

它共有三个步骤:执行new int;构造shared_ptr<int>,调用foo(),但是由于编译器对于同一语句的各项操作具有重新排列的自由,因此除了执行new int肯定在构造shared_ptr<int>之前外,调用foo(),可以发生在任何阶段,可能在最前,中间,最后,如果是按:执行new int→调用foo()→构造shared_ptr<int>的顺序执行,那么如果foo()发生异常,就会在shared_ptr<int>构造之前造成内存泄露.

2. 对于1出现的问题,可以利用编译器对于"跨越语句的各项操作"没有重新排列的权力,以独立语句将newed对象置入智能指针,如下:

shared_ptr<int> ptr(new int);
fun(ptr,foo);
View Code

这样可以防止由于foo在new出的int被放入shared_ptr<int>之前抛出异常而导致内存泄露,但要注意:

ptr不是临时对象,也就是说调用fun后ptr管理的内存没有被释放,而ptr的存在并不是为了要访问底层资源,而是为了防止出现异常而造成内存泄露存在的,所以如果不需要ptr所指向的内存,最好调用reset()将它释放.(个人认为这个条款有些鸡肋)

转载于:https://www.cnblogs.com/reasno/p/4752523.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值