Effective C++ 条款15、16 在资源管理类中提供对原始资源的访问||成对使用new 与 delete要采取相同形式
1、在资源管理类中提供对原始资源的访问
前几个条款很棒,它们是对抗资源泄露的壁垒,但很多APIs直接指向 资源,这个时候,我们需要直接访问原始资源。
这里,有两种方法解决上述问题,我们可将RAII对象转换为原始资源。通过 显式转换与隐式转换。
通常,tr1:: shared_ptr 和 auto_ptr 都提供一个get成员函数,用来执行显式转换,也就是返回智能指针内部的原始指针的复件。因为它也重载了指针取值操作符* –>。当然也可以通过隐式转换为底部原始指针。
class font
{
FontHandle get() const
{
return f;
} //FontHandle是资源,显式转换函数
operator FontHandle() const
{
return f;
}//隐式转换,可能会引起 “非故意之类型转换”
}
这两种方法之间的选择取决于RAII类被设计的特定工作。
记住:
APIs往往要求访问原始资源,所以每一个RAII都需要提供一个取得其管理的资源的方法。
对原始资源的访问可能经由显式转换与隐式转换,一般而言显式转换比较安全,但隐式转换对客户比较方便。
2、成对使用new 与 delete
记住:
new 数组时,直接调用delete[] + 数组名。
即:如果你在new表达式中使用了[],必须在相应的表达式中也使用[],如果你在new表达式中没使用[],一定不要在相应的delete表达式中使用[]。