首先假设对于一个mutex互斥器对象,有lock以及unlock两个函数可用: void lock(Mutex * pm); void unlock(Mutex * pm); 那么为了防止资源忘记被释放,首先得想法就是创建一个RAII类来进行资源的管理,像下面这样: class Lock{ explicit Lock(Mutex * mutex) :mtx(mutex){} ~Lock(){unlock(mtx)} private: Mutex * mtx; }; 然后再用户想要使用的时候就应该…
复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为. 普遍而常见的RAII class copying行为是:抑制copying(使用私有继承Uncopyable).施行引用计数法(reference counting)(即std::tr1::shared_ptr,可以自己指定删除器).不过其他行为也都可能被实现.…
问题聚焦:     上一条款所告诉我们的智能指针,只适合与在堆中的资源,而并非所有资源都是在堆中的.     这时候,我们可能需要建立自己的资源管理类,那么建立自己的资源管理类时,需要注意什么呢?. 在详述这一章的主题之前,先回忆一下上一节所提到的一个名词——RAII(Resource Acquisition Is Initialization) 含义就是:资源取得时机便是初始化时机. 如果上一节对这个观念的理解还不是很深的话,那么下面这个例子可以让你更好地理解. Demo 假设我们使用C AP…
1. 自己实现一个资源管理类 Item 13中介绍了 “资源获取之时也是初始化之时(RAII)”的概念,这个概念被当作资源管理类的“脊柱“,也描述了auto_ptr和tr1::shared_ptr是如何用堆资源来表现这个概念的.然而并不是所有资源都是在堆上创建的,对于这种资源,像auto_ptr和tr1::shared_ptr这样的智能指针就不适合当作资源句柄(handle)来使用了.你会发现你时不时的就会需要创建自己的资源管理类. 举个例子,假设你正在使用C API来操纵Mutex类型的互斥信…
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…
请牢记: 1.复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为. 2.普遍常见的RAII class copying行为是:抑制copying.施行引用计数法.不过其他行为也可能被实现. auto_ptr和tr1::shared_ptr的观念表现在heap_based资源上.然而并非所有资源都是heap_based,对于非heap_based资源而言,需要建立自己的资源管理类. 假设我们使用C API函数出来类型为Mutex的互斥器对象…
三.资源管理       资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket等. 1.        以对象管理资源       void f() {     investment *plv = createInvestment();     //这里存在很多不定因素,可能造成下面语句无法执行,这就存在资源泄露的可能.     delete plv; }      这里我们…
1.在资源管理类中提供对原始资源的访问     前几个条款很棒,它们是对抗资源泄露的壁垒,但很多APIs直接指向 资源,这个时候,我们需要直接访问原始资源.     这里,有两种方法解决上述问题,我们可将RAII对象转换为原始资源.通过 显式转换与隐式转换.     通常,tr1:: shared_ptr 和 auto_ptr 都提供一个get成员函数,用来执行显式转换,也就是返回智能指针内部的原始指针的复件.因为它也重载了指针取值操作符* –>.当然也可以通过隐式转换为底部原始指针.     …
场景 上一节实现了智能指针,其中的拷贝构造函数和赋值运算符是通过增加/减少指针的引用计数来操作的.但是如果是管理一个独占资源呢?我们希望在一个资源使用时被锁定,在使用完毕后被释放. #include <mutex> #include <thread> #include <iostream> using namespace std; mutex mu; int rc=5; void thread1(){ //mu.lock(); rc+=5; cout<<&q…
1.为什么要使用资源管理类? 资源管理类的思路就是,栈上的对象,封装堆上分配的资源,确保一定会释放资源.auto_ptr和shared_ptr就是资源管理类,行为上像指针. 2.auto_ptr和shared_ptr用来管理,堆上分配的内存,在auto_ptr和shared_ptr的析构方法中,执行delete.对于其他资源,auto_ptr和shared_ptr并不适合作为资源管理类.考虑互斥锁mutex,有普通方法lock和unlock,提供一个资源管理类Lock,管理mutex.资源管理类…