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;
}
}
};
C++ 智能指针share_ptr 和weak_ptr的实现
最新推荐文章于 2023-09-04 03:27:33 发布