【Effective C++读书笔记】篇七(条款16~条款17)

条款16:成对使用 new 和 delete 时要采取相同形式               


特别需要小心的如:

typedef int a[4];
int *pi = new a;            //new a得到的是一维指针 int *,而非 int(*)[],此处相当于 pi = new int[4];
delete pi;                  //行为未定义
delete[] pi;                //正确,使用了匹配“数组形式”的 delete[]

请记住:如果你在 new 表达式中使用 [],必须在相应的 delete 表达式中也使用 []。如果你再 new 表达式中不使用 [],一定不要在相应的 delete 表达式中使用 []。





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


主要原因如下:

fun(tr1::shared_ptr<Widget>(new Widget), process());

我们知道在执行 fun() 函数之前,需要先构造一个智能指针(分为两步:1、new Widget;2 、调用 tr1::shared_ptr 构造函数)以及执行函数 process()。

可是对于C++编译器来说,它会以什么样的次序来执呢?确定的是tr1::shared_ptr 构造函数一定是在 new Widget 之后执行的,可是 process() 的调用排在第一?第二?还是第三执行,我们并不能确定。由此引发如果 process() 在第二顺位执行且发生异常,注意此时 new Widget 执行完毕,但却还未来及将其放入智能指针中管理起来,导致在第二步异常发生时函数返回造成内存泄露。

为了避免这个问题,我们应该将tr1::shared_ptr<Widget>(new Widget)和process()两句分开调用:

tr1::shared_ptr<Widget> pw(new Widget);
fun(pw, process());
这样就不会发生之前的惨剧。


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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值