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