Effective C++读书笔记(11)

来源:互联网 发布:飞耀速录软件 编辑:程序博客网 时间:2024/05/21 04:42

条款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());


0 0
原创粉丝点击