1、实现多个智能指针指向同一个资源,不会造成指针失效,也不会造成资源被多次释放。
2、缺点是多线程环境下,不安全,需要加锁。
#include <iostream>
#include <memory>
using namespace std;
template <typename T>
class RefCnt
{
public:
RefCnt(T *ptr = nullptr) : mptr(ptr)
{
if (mptr != nullptr)
{
count = 1;
}
}
~RefCnt()
{
if (count = 0)
{
delete mptr;
}
}
int addref()
{
return count++;
}
int cutref()
{
return count--;
}
private:
int count;
T *mptr;
};
template <typename T>
class Smart_ptr
{
public:
Smart_ptr(T *ptr = nullptr) : Ptr(ptr)
{
refcnt = new RefCnt<T>(ptr); //给此处的ptr建立引用计数
};
T *operator->()
{
return Ptr;
refcnt = nullptr;
}
T &operator*()
{
return *Ptr;
}
~Smart_ptr()
{
if(0==refcnt->cutref())
{
delete Ptr;
}
Ptr=nullptr;
}
Smart_ptr(const Smart_ptr<T> &src) : Ptr(src), refcnt(src.refcnt)
{
if (Ptr != nullptr)
{
refcnt->addref();
}
}
Smart_ptr<T> &operator=(const Smart_ptr<T> &src)
{
if(this==&src)
{
return *this;
}
Ptr=src.Ptr;
refcnt=src.refcnt;
refcnt->addref();
}
private:
T *Ptr;
RefCnt<T>* refcnt;
};
class test
{
public:
void fun()
{
cout << "fun" << endl;
}
};
int main()
{
Smart_ptr<test> ptr(new test);
Smart_ptr<test> p2;
Smart_ptr<test> p3;
p2=ptr;
p3=p2;
p2->fun();
return 0;
}