Effective C++读书笔记(11)

本文探讨了资源管理类的设计原则,包括提供原始资源访问的方法如显式和隐式转换,确保new和delete配对使用的正确性,以及如何安全地将newed对象置于智能指针中以避免资源泄露。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

条款15:在资源管理类中提供对原始资源的访问

资源管理类需要一个函数可以将RAII class对象转移到其所包含的原始资源,可以通过显式转换或隐式转换完成。

显式转换:常在RAII class中定义一个get成员函数,用于返回RAII class内部的原始资源。也可以通过重载*或者->运算符。

隐式转换:重载类型转换运算符。


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

如果在new表达式中用了[],必须在相应的delete表达式中也使用[]。如果在new表达式中未使用[],则一定不要在相应的delete中使用[]。(因此最好尽量不要对数组形式进行typedef操作


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

假设需要对一个资源置于智能指针中后进行某种操作。编写可以编译通过的语句如下:

processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());

由于C++核对实参的顺序是未知的(java和c#是已知的),因此上述语句可能造成资源泄露。例如以如下顺序核对实参:

1.执行“new Widget"

2.调用priority

3.调用tr1::shared_ptr构造函数

如果第2步异常,new Wighet返回的指针将会遗失,未放入智能指针,可能引发资源泄露。

解决方法:使用分离语句:

std:tr1::shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority());


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值