C++ 智能指针share_ptr 和weak_ptr的实现

class Count
{
	public:
		Count():s(0),w(0){}
		int s;//share指针计数 
		int w;//weak指针计数 
};

template<class T>
class Weak_ptr;//先引用 

template<class T>
class Share_ptr
{
	T * ptr;//管理的指针 
	Count * cnt;//计数 
	public:
		Share_ptr(T * p = 0):ptr(p)//构造函数 
		{
			ptr = p;
			cnt = new Count();
		}
		Share_ptr(Share_ptr<T> const& s)//拷贝构造函数, 
		{
			ptr=s.ptr;//对象切换 
			cnt=s.cnt;//值切换 
			cnt->s++;//share计数增加 
		}
		Share_ptr(Weak_ptr<T> const& w)
		{
			ptr = w.ptr;
			cnt = w.cnt;
			cnt->s++; //share计数增加 
		}
		~Share_ptr()//离开生命周期时调用 
		{
			release();//清空内存 
		}
		Share_ptr<T> &operator=(Share_ptr<T> const& s)//赋值运算 
		{
			if(this != &s)//判断是否是相等的指针如果不是 
			{
				release();//释放原有的 
				ptr=s.ptr;//修改对象指针 
				cnt=s.cnt;//修改计数器 
				cnt->s++;//计数器增加 
			}
			return *this;//返回 
		}
		T& operator*()
		{
			*ptr;//解引用 
		}
		
		T* operator->()
		{
			return ptr;//返回原指针 
		} 
		
		friend class Weak_ptr<T>;//方便Weak指针操作本类 
		
	protected:
		void release()//释放操作 
		{
			cnt->s--;//share计数减1 
			if(cnt->s<1)//如果小于一了,说明没有指向原指针的share指针 
			{
				delete ptr;//删除ptr,调用ptr的析构函数 
				if(cnt->w<1)//如果weak引用小于1了再去删除cnt 
				{
					delete cnt;
					cnt=NULL;
				}
			}
		}
		
};

template<class T>
class Weak_ptr
{
	T * ptr;
	Count * cnt;
	public:
		Weak_ptr()//构造函数 
		{
			cnt=0;
			ptr=0;
		}
		Weak_ptr(Weak_ptr<T> &w):ptr(w.ptr),cnt(w.cnt)//同上 
		{
			cnt->w++;
		}
		Weak_ptr(Share_ptr<T> &s):ptr(s.ptr),cnt(s.cnt)//同上 
		{
			cnt->w++;
		}
		Weak_ptr<T>& operator=(Weak_ptr<T> &w)//同上 
		{
			if(this!=&w)
			{
				release();
				cnt=w.cnt;
				ptr=w.ptr;
				cnt->w++;
			}
			return *this;
		}
		Weak_ptr<T>& operator=(Share_ptr<T> &s)//同上 
		{
			release();
			cnt=s.cnt;
			ptr=s.ptr;
			cnt->w++;
			return *this;
		}
		Share_ptr<T> lock()//强转 
		{
			return static_cast<Share_ptr<T>>(*this);
		}
		~Weak_ptr()//释放 
		{
			release();
		}
		friend class Share_ptr<T>;
	protected:
		void release()
		{
			cnt->w--;
			if(cnt->s<1&&cnt->w<1)
			{
				//这里的cnt不用删除,因为在share中已经被删了 
				//delete cnt;
				cnt=NULL;	
			}	
		}	
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值