(一) 在一项条款说法auto_ptr和tr1::share_ptr适合heap-based资源.然而,并非所有的资源都heap-based的.换句话说不tr1::shared_ptr 和 auto_ptr 总是适合作为资源管理器.管理类型. 如果Mutex类型通过lock和unlock两组函数进行相互排斥器的锁定和解锁,可能我们希望和auto_ptr一样的行为.在某个智能类型析构时主动调用unlock进行解锁. 比方以下的代码: void lock(Mutex* pm); void unloc…
复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为. 普遍而常见的RAII class copying行为是:抑制copying(使用私有继承Uncopyable).施行引用计数法(reference counting)(即std::tr1::shared_ptr,可以自己指定删除器).不过其他行为也都可能被实现.…
请牢记: 1.复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为. 2.普遍常见的RAII class copying行为是:抑制copying.施行引用计数法.不过其他行为也可能被实现. auto_ptr和tr1::shared_ptr的观念表现在heap_based资源上.然而并非所有资源都是heap_based,对于非heap_based资源而言,需要建立自己的资源管理类. 假设我们使用C API函数出来类型为Mutex的互斥器对象…
NOTE: 1.复制RAII 对象必须一并赋值它所管理的资源,所以资源的copying行为决定RAII对象的copying行为. 2.普遍而常见的RAII class copying 行为是: 抑制copying 施行引用计数法(reference counting). 不过其他行为也都可能被实现.…
在资源管理器中小心copying行为 上节是对资源的管理说明.有时候我们不能依赖于shared_ptr或者auto_ptr,所以我们须要自己建立一个资源管理类来管理自己的资源. 比如建立一个类来管理Mutex锁.如今使用函数处理类型为Mutex的相互排斥器对象 class Lock{ public: explicit Lock(Mutex* mu):mutexPtr(mu) { lock(mutexPtr); } ~Lock() { unlock(mutexPtr); } private: Mu…
In C++, the only code that guaranteed to be executed after an exception is thrown are the destructors of objects residing in stack and that's why we need RAII. We don't always deal with head based objects, so instead with using auto_ptrs and shared_p…
APIs往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理之资源”的办法. 对原始资源的访问可能经由显示转换(.get()成员函数或者指针取值操作符->,*)或隐式转换(提供隐式转换函数).一般而言显示转换比较安全,但隐式转换对客户比较方便.…
首先假设对于一个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; }; 然后再用户想要使用的时候就应该…
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(2)-读书笔记 <Effective C++>第3章 资源管理(1)-读书笔记 <Effective C++>第3章 资源管理(2)-读书笔记 <Effective C++>第4章 设计与声明(1)-读书笔记 <Eff…
参考:http://www.cnblogs.com/ronny/p/3745098.html 资源:动态分配的内存.文件描述器.互斥锁.图形界面中的字型与笔刷.数据库连接以及网络sockets等,       无论哪一种资源,重要的是,当你不再使用它时,必须将它还给系统.       条款13:以对象管理资源 当我们向系统申请资源后,一定要记得释放,不然就容易发生内存泄漏,但是意识到这样一件事并不是很容易 解决方法是我们把指针放在一个资源管理的类里,让类对象在生命结束的时候,会自动调用析构函数,…