Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44505
  • 博文数量: 9
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-03 07:58
文章分类

全部博文(9)

文章存档

2014年(4)

2013年(5)

我的朋友

分类: C/C++

2013-12-03 17:41:13

智能指针自实现的原理:
1、IReferenceControl
对象引用计数的实现,包括AddReference,ReleaseReference,支持多线程安全

2、CRtAutoPtr
继承自IReferenceControl的对象指针的复制、构造


用法:
1、目标对象须继承自CRtReferenceControlMutilThread

2、全局对象创建时,须手动AddReference

3、全局对象释放时,须手动ReleaseReference
============================
/** 
 * ReferenceControl basic classes, for mutil-thread.
 * TODO: use AtomicIncrement instead MutexThread!
 */
template class CRtReferenceControlT
{
public:
 CRtReferenceControlT()
 {
 }

 virtual ~CRtReferenceControlT()
 {
 }

 DWORD AddReference()
 {
  return ++m_Atomic;
 }

 DWORD ReleaseReference()
 {
  DWORD dwRef = --m_Atomic;
  if (dwRef == 0)
   OnReferenceDestory();
  return dwRef;
 }

 DWORD GetReference()
 {
  return m_Atomic.GetValue();
 }

protected:
 virtual void OnReferenceDestory()
 {
  delete this;
 }

 CRtAtomicOperationT m_Atomic;
};

/** 
 * Auto pointer for ReferenceControl
 */
template class CRtAutoPtr
{
public:
 CRtAutoPtr(T *aPtr = NULL)
  : m_pRawPtr(aPtr)
 {
  if (m_pRawPtr)
   m_pRawPtr->AddReference();
 }

 CRtAutoPtr(const CRtAutoPtr& aAutoPtr)
  : m_pRawPtr(aAutoPtr.m_pRawPtr)
 {
  if (m_pRawPtr)
   m_pRawPtr->AddReference();
 }

 ~CRtAutoPtr()
 {
  if (m_pRawPtr)
   m_pRawPtr->ReleaseReference();
 }

 CRtAutoPtr& operator = (const CRtAutoPtr& aAutoPtr)
 {
  return (*this = aAutoPtr.m_pRawPtr);
 }

 CRtAutoPtr& operator = (T* aPtr)
 {
  if (m_pRawPtr == aPtr)
   return *this;
  if (aPtr)
   aPtr->AddReference();
  if (m_pRawPtr)
   m_pRawPtr->ReleaseReference();
  m_pRawPtr = aPtr;
  return *this;
 }

 operator void* () const
 {
  return m_pRawPtr;
 }

 T* operator -> () const
 {
  RT_ASSERTE(m_pRawPtr);
  return m_pRawPtr;
 }

 T* Get() const
 {
  return m_pRawPtr;
 }

 T* ParaIn() const
 {
  return m_pRawPtr;
 }

 T*& ParaOut()
 {
  if (m_pRawPtr) {
   m_pRawPtr->ReleaseReference();
   m_pRawPtr = NULL;
  }
  return static_cast(m_pRawPtr);
 }

 T*& ParaInOut()
 {
  return static_cast(m_pRawPtr);
 }

 T& operator * () const
 {
  RT_ASSERTE(m_pRawPtr);
  return *m_pRawPtr;
 }

private:
 T *m_pRawPtr;
};

typedef CRtReferenceControlT CRtReferenceControlMutilThread;
阅读(1517) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~