【读书笔记】Effective C++—3 资源管理(之4)

Effective C++读书笔记

--By Nathan.Yu 2007-12-08--

3 资源管理(之四)

条款16:成对使用newdelete时要采取相同形式(Use the same form in corresponding uses of new and delete

使用new时发生的事情:

1、  内存被分配(通过operator new函数)

2、  针对此内存会有一个或多个构造函数被调用。

 

使用delete时发生的事情:

1、  针对此内存会有一个或多个析构函数被调用。

2、  释放内存(通过operator delete函数)

 

delete的最大问题在于:即将被删除的内存中含多少对象?(指针所指的是单一对象还是数组?

 

如果你调用new时使用[],你必须在delete时也使用[]。如果你调用new时没有使用[],那么delete时也不需[]

 

最好不要对数组形式做typedefs动作。

 

请记住:

1、             如果你在 new表达式中使用[],必须在相应的delete表达式中也使用[]。如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[]

 

条款17:以独立语句将newed对象置入智能指针(Store newed objects in smart pointers in standalone statements

有函数:

proessWidget(std::tr1::shared_ptr<Widget> pw, int);

有调用:

processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority()); // 可能引起资源泄漏

 

这个调用可能引起资源泄漏!

 

因为C++不像JavaC#总以特定的顺序完成函数参数的核算。

 

因此,参数的调用过程可能是这样的:

1)        new Widget()

2)        priority() ; //如果这里产生异常,则1new的资源就会泄漏了

3)        shared_ptr的构造函数

但可以确定1)总在3)之前。

 

避免这类问题的方法:

std::tr1::shared_ptr<Widget> pw(new Widget)// 以独立语句将newed对象置入智能指针

processWidget(pw, priority()); // 绝不会引起资源泄漏

 

请记住:

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

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值