effective c++ 在资源管理类中小心copying 行为
2015-10-24 20:05
316 查看
资源取得时机便是初始化时机
为确保不会忘记解锁Mutex互斥对象,可能会设计一个class来管理
用户对Lock的用法:
如果试图复制Lock对象怎么办?!
1.禁止复制,通过声明private拷贝构造函数或者私有继承自己定义Uncopyable类
2.对底层资源祭出“引用计数法”
比如shared_ptr
并且将缺省行为“当引用次数为0时删除所指物”改成解锁
(shared_ptr允许制定所谓的“删除器”)
class Mutex{}; void lock(Mutex* p){} void unlock(Mutex* p){} class Lock { public: explicit Lock(Mutex *p) :mutexPtr(p) { lock(mutexPtr); } ~Lock() { unlock(mutexPtr); } private: Mutex *mutexPtr; };
为确保不会忘记解锁Mutex互斥对象,可能会设计一个class来管理
用户对Lock的用法:
Mutex m; { Lock m1(&m);//锁定互斥锁 } //在区块最末尾,自动接触互斥锁锁定
Lock m1(&m); Lock m2(m1);
如果试图复制Lock对象怎么办?!
1.禁止复制,通过声明private拷贝构造函数或者私有继承自己定义Uncopyable类
2.对底层资源祭出“引用计数法”
比如shared_ptr
并且将缺省行为“当引用次数为0时删除所指物”改成解锁
(shared_ptr允许制定所谓的“删除器”)
class Mutex{}; void lock(Mutex* p){cout << "lock" << endl;} void unlock(Mutex* p){cout << "unlock" << endl;} class Lock { public: explicit Lock(Mutex *p) :mutexPtr(p,unlock) { lock(mutexPtr.get()); //返回Mutex类型的指针 } private: shared_ptr<Mutex>mutexPtr; }; int main() { Mutex m; { cout << "---------------------" << endl; Lock m1(&m); cout << "---------------------" << endl; Lock m2(m1); cout << "---------------------" << endl; } return 0; }
相关文章推荐
- Lua编程示例(二):面向对象、metatable对表进行扩展
- C#中面向对象编程机制之多态学习笔记
- 浅谈Lua的面向对象特性
- Lua面向对象之类和继承浅析
- JavaScript面向对象的两种书写方法以及差别
- 浅谈c# 面向对象之类与对象
- C#面向对象特征的具体实现及作用详解
- C# 面向对象的基本原则
- 浅谈对c# 面向对象的理解
- Ruby面向对象编程详解
- php学习 面向对象 课件第1/2页
- PHP程序61条面向对象分析设计的经验小结
- 收集学习asp.net比较完整的面向对象开发流程
- javascript 面向对象编程 万物皆对象
- 不错的JavaScript面向对象的简单入门介绍第1/2页
- [推荐]javascript 面向对象技术基础教程
- javascript 面向对象的JavaScript类
- JavaScript中的面向对象介绍
- javascript实现面向对象类的功能书写技巧
- Javascript 面向对象 继承