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

来源:互联网 发布:办公室自动化软件 编辑:程序博客网 时间:2024/05/17 02:37

条款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
原创粉丝点击