weak_ptr简单实现

#include <iostream>

class Counter
{
public:
	Counter() :s(0), w(0){};
	int s;
	int w;
};
template<class T> class WeakPtr;//为了用weak_ptr的lock(),来生成share_ptr用,需要拷贝构造用
template<class T>
class SharePtr
{
public:
	SharePtr(T* p = 0):_ptr(p){
		cnt = new Counter();
		if (p)
			cnt->s = 1;
		cout << "SharePtr construct " << cnt->s << endl;
	}
	~SharePtr()
	{
		release();
	}

	SharePtr(SharePtr<T> const &s)
	{
		cout << "in copy con" << endl;
		_ptr = s._ptr;
		(s.cnt)->s++;
		cout << "copy construct" << (s.cnt)->s << endl;
		cnt = s.cnt;
	}
	SharePtr(WeakPtr<T> const &w)//为了用weak_ptr的lock(),来生成share_ptr用,需要拷贝构造用
	{
		cout << "in w copy con " << endl;
		_ptr = w._ptr;
		(w.cnt)->s++;
		cout << "copy w  construct" << (w.cnt)->s << endl;
		cnt = w.cnt;
	}
	SharePtr<T>& operator=(SharePtr<T> &s)
	{
		if (this != &s)
		{
			release();
			(s.cnt)->s++;
			cout << "assign construct " << (s.cnt)->s << endl;
			cnt = s.cnt;
			_ptr = s._ptr;
		}
		return *this;
	}
	T& operator *()
	{
		return *_ptr;
	}
	T* operator ->()
	{
		return _ptr;
	}
	friend class WeakPtr<T>; //方便weak_ptr与share_ptr设置引用计数和赋值。
public:
	void release()
	{
	
		cnt->s--;
		cout << "into SharePtr release " << cnt->s << endl;
		if (cnt->s <1)
		{
			
			delete _ptr;
			cout << "SharePtr release " << cnt->s<< endl;
			if (cnt->w <1)
			{
				delete cnt;
				cnt = NULL;
			}
		}
	}
	T* _ptr;
	Counter* cnt;
};
template<class T>
class WeakPtr
{
public://给出默认构造和拷贝构造,其中拷贝构造不能有从原始指针进行构造
	WeakPtr()
	{
		_ptr = 0;
		cnt = 0;
		cout << "WeakPtr construct " << endl;
	}
	WeakPtr(SharePtr<T>& s) :
		_ptr(s._ptr), cnt(s.cnt)
	{
		cout << "w con s" << endl;
		cnt->w++;
	}
	WeakPtr(WeakPtr<T>& w) :
		_ptr(w._ptr), cnt(w.cnt)
	{
		cnt->w++;
	}
	~WeakPtr()
	{
		release();
	}
	WeakPtr<T>& operator =(WeakPtr<T> & w)
	{
		if (this != &w)
		{
			release();
			cnt = w.cnt;
			cnt->w++;
			_ptr = w._ptr;
		}
		return *this;
	}
	WeakPtr<T>& operator =(SharePtr<T> & s)
	{
		cout << "w = s" << endl;
		release();
		cnt = s.cnt;
		cnt->w++;
		_ptr = s._ptr;
		return *this;
	}
	SharePtr<T> lock()
	{
		return SharePtr<T>(*this);
	}
	bool expired()
	{
		if (cnt)
		{
			if (cnt->s >0)
			{
				cout << "empty " << cnt->s << endl;
				return false;
			}
		}
		return true;
	}
	friend class SharePtr<T>;//方便weak_ptr与share_ptr设置引用计数和赋值。
private:
	void release()
	{
		cout << "into WeakPtr release" << endl;
		if (cnt)
		{
			cnt->w--;
			if (cnt->w <1 && cnt->s <1)
			{
				cout << "weakptr release" << endl;
				cnt = NULL;
			}
		}
	}
	T* _ptr;
	Counter* cnt;
};

class parent;
class child;
class parent
{
public:
	// SharePtr<child> ch;
	WeakPtr<child> ch;
};
class child
{
public:
	SharePtr<parent> pt;
};
using namespace std;
void test(){
	SharePtr<parent> ft(new parent());  //  s2    w0           s2 引用计数到了2 没有销毁
	SharePtr<child> son(new child());   //  s1    w0           s2 引用计数到了2 没有销毁
	
	ft->ch = son; //左w右s,右边的w--,右边w++
	son->pt = ft; //左s右s,左边s--销毁,右边s++
	cout << "-------------" << endl;
}
int main()
{

	test();
	//SharePtr<child> son2=(ft->ch).lock();
	cin.get();
	return 0;
}

输出:

WeakPtr construct
SharePtr construct 1
SharePtr construct 0
SharePtr construct 1
w = s
into WeakPtr release
into SharePtr release -1
SharePtr release -1
assign construct 2
-------------
into SharePtr release 0
into SharePtr release 1
SharePtr release 0
into SharePtr release 0
into WeakPtr release
weakptr release
SharePtr release 0

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值