引言 资源管理类是防止资源泄漏的有力武器,但是许多APIs直接指涉资源,除非你发誓永不使用这样的APIs,否则只得绕过资源管理对象(resource-managing objects)直接访问原始资源(raw resources). 例如在条款13中引入了智能指针如auto_ptr或tr1::shared_ptr保存factory函数如createInvestment的调用结果: std::tr1::shared_ptr<Investement> pInv(createInvestment()…
  问题聚焦:     资源管理类是为了对抗资源泄露.     如果一些函数需要访问原始资源,资源管理类应该怎么做呢?        关于资源管理的概念总是显得那么的高大上,其实只是抽象一点. 下面用一个例子还说明本节的主题: 在前面 Effective C++(13) 用对象管理资源 中我们提到过,使用智能指针保存工厂函数返回的结果 std::tr1::shared_ptr<Investment> pInv(createInvestment()); //加入有某个函数,用来处理Investm…
1.在资源管理类中提供对原始资源的访问     前几个条款很棒,它们是对抗资源泄露的壁垒,但很多APIs直接指向 资源,这个时候,我们需要直接访问原始资源.     这里,有两种方法解决上述问题,我们可将RAII对象转换为原始资源.通过 显式转换与隐式转换.     通常,tr1:: shared_ptr 和 auto_ptr 都提供一个get成员函数,用来执行显式转换,也就是返回智能指针内部的原始指针的复件.因为它也重载了指针取值操作符* –>.当然也可以通过隐式转换为底部原始指针.     …
APIs往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理之资源”的办法. 对原始资源的访问可能经由显示转换(.get()成员函数或者指针取值操作符->,*)或隐式转换(提供隐式转换函数).一般而言显示转换比较安全,但隐式转换对客户比较方便.…
NOTE: 1.APIs往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理之资源”的办法. 2.对原始资源的访问可能经由显示转换或隐式转换.一般而言显示转换比较安全,但隐式转换对客户比较方便.…
void f(int* a) { cout <<* a << endl; } int main() { shared_ptr<int> p(new int(3)); f(p.get());//shared_ptr<int> 是无法隐式转换成int* ,但用.get()就可以把她转换回原始指针 }…
1.为什么需要访问资源管理类中的原生资源  资源管理类是很奇妙的.它们是防止资源泄漏的堡垒,没有资源泄漏发生是设计良好的系统的一个基本特征.在一个完美的世界中,你需要依赖这样的类来同资源进行交互,绝不要直接访问原生(raw)资源而玷污你的双手.但是世界不是完美的,许多API会直接引用资源,所以除非你放弃使用这样的API(这是不实际的想法),你将会绕开资源管理类而时不时的处理原生资源. 2. 如何获取原生资源——通过显示转换和隐式转换 2.1 一个例子 举个例子,Item 13中介绍了使用像aut…
问题聚焦:     上一条款所告诉我们的智能指针,只适合与在堆中的资源,而并非所有资源都是在堆中的.     这时候,我们可能需要建立自己的资源管理类,那么建立自己的资源管理类时,需要注意什么呢?. 在详述这一章的主题之前,先回忆一下上一节所提到的一个名词——RAII(Resource Acquisition Is Initialization) 含义就是:资源取得时机便是初始化时机. 如果上一节对这个观念的理解还不是很深的话,那么下面这个例子可以让你更好地理解. Demo 假设我们使用C AP…
第一节 <背景> 条款13中讲到“资源取得的时机便是初始化时机”并由此引出“以对象管理资源”的概念.通常情况下使用std中的auto_ptr(智能指针)和tr1::shared_ptr(引数智能指针)作为管理资源的对象.事实上,这种管理方法十分有效.但是,auto_ptr和tr1::shared_ptr只能管理基于堆(heap-based)的资源,而非heap-based的资源却往往不适合.因此,有的时候你需要建立自己的资源管理类.本文介绍的内容是在你建立自己的资源管理类时应该注意的事项. 第…
class A { private: int *p; void lock(){ cout << p << "is lock" << endl; } void unlock(){ cout << p << "is non-lock" << endl; } public: A(int* a) :p(a){ lock(); } ~A(){ unlock(); } }; int main() { int…