引用计数

引用计数的实现:

template <class T>

class ReferenceCount

{

public:

  explicit ReferenceCount(T* p):ptr(p),count(new int(1)){}

  ReferenceCount(const ReferenceCount<T>& p) throw() : ptr(p.ptr),count(p.count)

  {

    ++*count;

  }

  ReferenceCount<T>&  operator = (const ReferenceCount<T>& p)

  {

    if(this != &p)

    {

      dispose();

      ptr = p.ptr;

      count = p.count;

      ++*count;

    }

    return *this;

  }

  T* operator->() throw()

  {

    return ptr;

  }

  T& operator *() throw()

  {

    return *ptr;

  }

private:

  void dispose()

  {

    if(0 == --*count)

    {

      delete ptr;

      delete count;

    }

  }

private:

  T* ptr;

  int* count;

};

 

数个群集共享相同的数据元素,可以运用引用计数。如下:

typedef ReferenceCount<std::string> stringPtr;
 char *strings[] ={"my","school","is","hdu"};
 std::deque<ReferenceCount<std::string> > coll1;
 std::deque<ReferenceCount<std::string> > coll2;
 for(int i = 0;i < 4;++i)
 {
  stringPtr tempStringPtr(new std::string(strings[i]));
  coll1.push_back(tempStringPtr);
  coll2.push_back(tempStringPtr);
 }

 

这样coll1和coll2中共享同一份数据,每个元素的引用计数都是2.

 

转载于:https://www.cnblogs.com/lverson/p/3219472.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值