#include <iostream>
#include <memory>
using namespace std;
//对资源引用计数的类
template<typename T>
class RefCnt
{
public:
RefCnt(T *ptr = nullptr):mptr(ptr)
{
if(mptr!=nullptr) mcount=1;
}
void addRef(){ mcount++;}
int delRef(){return --mcount;}
int getCount() {return mcount;}
private:
T *mptr;
int mcount;
};
//引用计数的智能指针
template<typename T>
class CSmartPtr
{
public:
CSmartPtr(T *ptr = nullptr):mptr(ptr)
{
mpRefCnt=new RefCnt<T>(mptr);
}
~CSmartPtr()
{
if(0==mpRefCnt->delRef())
{
delete mptr;
mptr=nullptr;
}
}
T& operator * () {return *mptr;}
T* operator -> () {return mptr;}
CSmartPtr(const CSmartPtr<T> &src)
:mptr(src.mptr),mpRefCnt(src.mpRefCnt)
{
if(mptr!=nullptr)
mpRefCnt->addRef();
}
CSmartPtr<T>& operator=(const CSmartPtr<T> &src)
{
if(this==&src)
return *this;
if(0==mpRefCnt->delRef())
delete mptr;
mptr=src.mptr;
mpRefCnt=src.mpRefCnt;
mpRefCnt->addRef();
return *this;
}
int getCount() {return mpRefCnt->getCount();}
private:
T *mptr; //指向资源的指针
RefCnt<T> *mpRefCnt; //指向该资源引用计数的指针
};
int main()
{
CSmartPtr<int> ptr1(new int);
CSmartPtr<int> ptr2(ptr1);
*ptr2=10;
CSmartPtr<int> p3=ptr1;
cout<<*p3<<endl;
cout<<p3.getCount()<<endl;
return 0;
}
实现带引用计数的智能指针
猜你喜欢
转载自blog.csdn.net/qq_44132777/article/details/114592873
今日推荐
周排行