#include <iostream>
#include <memory>
using namespace std;
template <typename T>
class SharedPtr{
private:
T *_ptr;
int *_pcount;
public:
SharedPtr(T *ptr= nullptr):_ptr(ptr),_pcount(new int(1)){}//构造函数
SharedPtr(const SharedPtr &s):_ptr(s._ptr),_pcount(s._pcount){//用另一个共享指针初始化共享指针
(*_pcount)++;
}
SharedPtr<T> &operator=(const SharedPtr &s){//重载=
if(this != &s)
{
if(--(*(this->_pcount))==0)//
{
delete this->_ptr;
delete this->_pcount;
}
_ptr=s._ptr;
_pcount=s._pcount;
*(_pcount)++;
}
return *this;
}
T &operator*()//重载*
{
return *(this->_ptr);
}
T *operator->()//重载->
{
return this->_ptr;
}
~SharedPtr()//析构函数
{
--(*(this->_pcount));
if(*(this->_pcount)==0)
{
delete _ptr;
_ptr= nullptr;
delete _pcount;
_pcount= nullptr;
}
}
};
int main() {
std::shared_ptr<int> p1(new int(4));
cout<<"p1: "<<p1<<" *p1 "<<*p1;
cout<<endl;
return 0;
}