chromium之ref_counted

namespace subtle {

class RefCountedBase {
 protected:
  RefCountedBase();
  ~RefCountedBase();

  void AddRef();

  // Returns true if the object should self-delete.
  bool Release();

 private:
  int ref_count_;
#ifndef NDEBUG
  bool in_dtor_;
#endif

  DFAKE_MUTEX(add_release_);

  DISALLOW_COPY_AND_ASSIGN(RefCountedBase);
};
};


//
// A base class for reference counted classes.  Otherwise, known as a cheap
// knock-off of WebKit's RefCounted<T> class.  To use this guy just extend your
// class from it like so:
//
//   class MyFoo : public base::RefCounted<MyFoo> {
//    ...
//   };
//
template <class T>
class RefCounted : public subtle::RefCountedBase {
 public:
  RefCounted() { }
  ~RefCounted() { }

  void AddRef() {
    subtle::RefCountedBase::AddRef();
  }

  void Release() {
    if (subtle::RefCountedBase::Release()) {
      delete static_cast<T*>(this);
    }
  }

 private:
  DISALLOW_COPY_AND_ASSIGN(RefCounted<T>);
};
截取的代码有两个类,分别是subtle::RefCountedBase,RefCounted。
第一个类subtle::RefCountedBase没有Public方法,只有protected和Private方法。
protected里面有两个方法,一个是AddRef,另一个是Release,伪代码如下
obj->AddRef();
bool needDeleteSelf = obj->Release();
if (needDeleteSelf) {
    delete obj;
}

第二个类RefCounted 是个模板,继承了subtle::RefCountedBase,而且有Public方法

使用方法更简单

class MyFoo : public base::RefCounted<MyFoo> {
};

MyFoo *foo = new MyFoo;
foo->AddRef();
foo->Release();
// foo has been delete


猜你喜欢

转载自www.cnblogs.com/ckelsel/p/9048351.html