深度探索智能指针(Smart Pointer)
主题索引:
一、剖析C++标准库智能指针(std::auto_ptr)
1.Do you Smart Pointer?
2.std::auto_ptr的设计原理
3.std::auto_ptr高级使用指南
4.你是否觉得std::auto_ptr还不够完美?
二、C++条件,寻找构造更强大的智能指针(Smart Pointer)的
策略
1.支持引用记数的多种设计策略
2.支持处理多种资源
3.支持Subclassing
4.支持多线程条件下,线程安全的多种设计策略
5.其它多种特殊要求下,再构造
三、Generic Programming基础技术和Smart Pointer
1.回首处理资源中的Traits技术
2.回首多线程支持的设计
四、COM实现中,Smart Pointer设计原理
五、著名C++库(标准和非标准)中的Smart Pointer现状
---------------------------------------------------------------------
二、C++条件,寻找构造更强大的智能指针(SmartPointer)的策略
1.支持引用记数的多种设计策略
你听说过COM和它著名的IUnknown接口吧?
IUnknown是干什么的?我要告诉你,IUnknown接口三个函数签名中,
两个是用来管理对象(CoClass Object,组件类对象)的记数来控制
它的生命周期的.
在实践中,我们的对象并不是只用一次,只允许一个引用的.
那么,谁来管理它的生命周期呢?
我们的策略是:引用记数. 当对象的引用记数为零时,就销毁对象.
在没有托管环境的情况下,事实上,销毁对象的往往还是auto_ptr.
而COM中,销毁对象的是对象自己.
事实上,它和我们的智能指针不是一个级别上的概念.
我们的智能指针负责的是对象级的引用.而COM是以接口引用为
核心的.保证接口操作时,接口引用记数的自动管理.
哦!是的!那么我们怎样给auto_ptr加上对象引用记数的功能?
策略1:
一个对象对应一个引用记数对象.
智能指针以记数对象为代理.
想象,这又归到经典的"添加中间层"解决方案上了.
# 核心一:
我们添加一个 "引用记数class".
它的职责有二:
a.维护对象的引用记数.
b.维护对象的指针.
结构示意如下:
template<class T>
class ObjRefCounted{
private:
T* m_OBJ_Delegate_Ptr;
unsigned int m_UIcounted;
public:
explicit ObjRefCounted(T* m_Paramin = 0):
m_UIcounted(1), m_OBJ_Delegate_Ptr(m_Paramin){};
template<class M> ObjRefCounted(ObjRefCounted<M>& x) {