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表达式中使用[]。

 

 

Effective C++ 条款15、16 在资源管理类中提供对原始资源的访问||成对使用new 与 delete要采取相同形式

时间: 2025-01-11 21:39:08

Effective C++ 条款15、16 在资源管理类中提供对原始资源的访问||成对使用new 与 delete要采取相同形式的相关文章

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

tr1::shared_ptr和tr1::auto_ptr都提供一个get成员函数,返回智能指针内部的原始指针: ) operator*和operator->隐式转换至底部指针: 注意:

条款15:在资源管理类中提供对原始资源的访问(Provide access to raw resources in resource-managing classes)

NOTE: 1.APIs往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理之资源”的办法. 2.对原始资源的访问可能经由显示转换或隐式转换.一般而言显示转换比较安全,但隐式转换对客户比较方便.

[015]在资源管理类中提供对原始资源的访问

引言 资源管理类是防止资源泄漏的有力武器,但是许多APIs直接指涉资源,除非你发誓永不使用这样的APIs,否则只得绕过资源管理对象(resource-managing objects)直接访问原始资源(raw resources). 例如在条款13中引入了智能指针如auto_ptr或tr1::shared_ptr保存factory函数如createInvestment的调用结果: std::tr1::shared_ptr<Investement> pInv(createInvestment()

读书笔记_Effective_C++_条款十五:在资源类管理类中提供对原始资源的访问

void f(int* a) { cout <<* a << endl; } int main() { shared_ptr<int> p(new int(3)); f(p.get());//shared_ptr<int> 是无法隐式转换成int* ,但用.get()就可以把她转换回原始指针 }

effective c++ 条款14:在资源管理类中小心拷贝行为

注意: 赋值RAII对象必须一并复制它所管理的资源,所以资源的拷贝行为决定RAII对象的拷贝行为. 普遍而常见的RAII类拷贝行为是:抑制拷贝,实行引用计数法. void lock(Mutex* pm); void unlock(Mutex* pm); class Lock { public: explicit Lock(Mutex* pm) : mutexPtr(pm) { lock(mutexPtr); } ~Lock() { unlock(mutexPtr); } private: Mut

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

(一) 下面代码: tr1::shared_ptr<Investment> pInv(createInvestment()); int daysHeld(const Investment* pi); 我们要调用daysHeld函数的话,就必须传递一个Investment指针,但是我们现在只有pInv对象,所以我们需要一个函数可将RAII class(本例为tr1::shared_ptr)对象转换为其所内含之原始资源(本例). 有两种方法,一种是显式转换,另外一种是隐式转换. (二)显式转换 t

条款14:在资源管理类中小心coping行为

以对象管理资源之后,某些资源不允许被复制,这时对象应该被private声明,为了资源在最后一次使用之后被释放应该使用shared_ptr并且给出对应的删除器: 注意:

Effective C++——条款15(第3章)

条款15:    在资源管理类中提供对原始资源的访问 Provide access to raw resources in resources-managing classes 资源管理类(resource-managing classes)很棒.它们是对抗资源泄露的堡垒.在一个良好的环境中将依赖这样的classes来处理和资源之间的所有互动.而不是直接处理原始资源,但这个环境并不完美,许多API直接涉及资源,因此有时只能绕过资源管理对象直接访问原始资源(raw resources). 例如,条

Effective C++ 条款15

在资源管理类中提供对原始资源的访问 前面两节都在讨论如何管理资源,一般情况下,使用资源管理类来屏蔽原始资源,对抗内存泄露等问题,避免使用原始资源.这样我们就无法直接访问原本的原始资源. 毕竟程序在有些时候是需要操纵原始资源的,许多APIs要求使用原始资源. 为了能操纵原始资源,我们要怎么做? 还好,shared_ptr和auto_ptr都提供一个get函数,用于执行这样的显示转换.这时如果在调用API时,如下: shared_prt<Investment> pInv=(createInvest