Implement smart pointers with reference counting

#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;
}

 

Guess you like

Origin blog.csdn.net/qq_44132777/article/details/114592873