实战智能指针(SmartPointer)

来源:计算机等级考试    发布时间:2012-08-29    计算机等级考试视频    评论

  最近在阅读Gamebryo的文档,先读的Object System这部分。Gamebryo中从NiRefObject继承下来的类都支持引用计数,也就是说支持0引用下对象自动销毁。

  一直以来都听闻智能指针的大名,平常项目中并没有使用过,所以也一直没抽空去研究,今天花了点时间自己实现了一个智能指针。

  要实现一个智能指针就要先实现一个支持引用计数的类,主要负责增加计数,减少计数,销毁持有的对象指针。大致实现如下:

  class RefObject

  template<class T> class RefObject

  {

  public:

  explicit RefObject(T* p):m_RefCount(1),m_pContainer(p)

  {

  }

  ~RefObject()

  {

  decRef();

  }

  void incRef()

  {

  ++m_RefCount;

  }

  void decRef()

  {

  if(--m_RefCount == 0)

  {

  destroy();

  }

  }

  T* getPtr()

  {

  return m_pContainer;

  }

  private:

  void destroy()

  {

  delete m_pContainer;

  m_pContainer = 0;

  m_RefCount = 0;

  delete this;

  }

  private:

  T*           m_pContainer;

  unsigned int m_RefCount;

  private:

  RefObject(const RefObject&);

  const RefObject& operator= (const RefObject&);

  };

  该模板类将持有一个使用者指定的对象T类型的指针,并维护该指针被引用的数量。在destroy函数中销毁T类型指针和自己。为什么要删除自己呢?这是因为RefObject将和T共存亡。因为我希望用户可以将任意类放入智能指针内部,而不是从RefObject继承下来。所以 RefObject是为T而生(由SmartPtr new出来的)。当用户直接使用RefObject时需要自己去调用incRef和decRef去增加和减少计数,因此即将设计的类SmartPtr实际上就是封装下RefObject,不需要用户来调这两个函数。SmartPtr实现大致如下:

  class SmartPtr

  template<class T> class SmartPtr

  {

  public:

  SmartPtr():m_pRefObject(0)

  {

  }

  explicit SmartPtr(T* p)

  {

  m_pRefObject = new RefObject<T>(p);

  }

  SmartPtr(const SmartPtr& other):m_pRefObject(other.m_pRefObject)

  {

  m_pRefObject->incRef();

  }

  ~SmartPtr()

  {

  if(m_pRefObject)

  m_pRefObject->decRef();

  }

  const SmartPtr<T>& operator= (const SmartPtr& other)

  {

  if(m_pRefObject != other.m_pRefObject)

  {

  m_pRefObject = other.m_pRefObject;

  m_pRefObject->incRef();

  }

  return *this;

  }

  T* operator-> () const

  {

  return m_pRefObject->getPtr();

  }

  T& operator* () const

  {

  return *m_pRefObject->getPtr();

  }

  protected:

  RefObject<T>* m_pRefObject;

  };

上一页12下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答