参考 http://www.jellythink.com/archives/301
proxy模式:
软件工程中,任何功能的实现其实都可以通过 增加中间层来实现。 proxy的作用就是基于此。
访问对象的时候增加了一定程度的间接
智能指针:
内存管理,何时释放,引用计数为0,自动释放。相当于给之前的单纯的m_pData 增加了一层。
通过proxy模式实现了智能指针
/*proxy模式 智能指针的实现
*/
#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }
//引用计数 互斥锁
class RefCount
{
public:
RefCount() :m_count(0) {}
public:
unsigned AddRef() { return InterlockedIncrement(&m_count); }
unsigned Release() { return InterlockedDecrement(&m_count); }
void Reset() { m_count = 0; }
private:
unsigned long m_count;
};
template <typename T>
class SmartPtr
{
public:
SmartPtr(void)
:m_pData(NULL)
{
m_pReference = new RefCount();
m_pReference->AddRef();
}
SmartPtr(T* pvalue)
:m_pData(pvalue)
{
m_pReference = new RefCount();
m_pReference->AddRef();
}
SmartPtr(const SmartPtr<T>& sp)
:m_pData(sp.m_pData)
, m_pReference(sp.m_pReference)
{
m_pReference->AddRef();
}
~SmartPtr(void)
{
if (m_pReference && m_pReference->Release() == 0)
{
SAFE_DELETE(m_pData);
SAFE_DELETE(m_pReference);
}
}
inline T& operator*()
{
return *m_pData;
}
inline T* operator->()
{
return m_pData;
}
SmartPtr<T>& operator=(const SmartPtr<T>& sp)
{
if (this != &sp)
{
if (m_pReference && m_pReference->Release() == 0)
{
SAFE_DELETE(m_pData);
SAFE_DELETE(m_pReference);
}
m_pData = sp.m_pData;
m_pReference = sp.m_pReference;
m_pReference->AddRef();
}
return *this;
}
SmartPtr<T>& operator=(T* pvalue)
{
if (m_pReference && m_pReference->Release() == 0)
{
SAFE_DELETE(m_pData);
SAFE_DELETE(m_pReference);
}
m_pData = pvalue;
m_pReference = new RefCount;
m_pReference->AddRef();
return *this;
}
T* Get()
{
T* ptr = NULL;
ptr = m_pData;
return ptr;
}
void Attach(T* object)
{
if (m_pReference && m_pReference->Release() == 0)
{
SAFE_DELETE(m_pData);
SAFE_DELETE(m_pReference);
}
m_pData = object;
m_pReference = new RefCount;
m_pReference->AddRef();
}
T* Detach()
{
T* ptr = NULL;
if (m_pData)
{
ptr = m_pData;
m_pData = NULL;
m_pReference->Reset();
}
return ptr;
}
private:
T* m_pData;
RefCount* m_pReference;
};
int main()
{
/*proxy模式 智能指针*/
Animal* dog = new Animal(1);
Animal* cat = new Animal(2);
SmartPtr<Animal> pdog(dog);
SmartPtr<Animal> pcat(cat);
}