namespace bit{
template<class T>
class SharedPtr
{
public:
SharedPtr(T* ptr = nullptr):_ptr(ptr),_pRefCount(new int(1)){}
~SharedPtr(){Release();}
//拷贝构造
SharedPtr(const SharedPtr<T>&sp):_ptr(sp._ptr),_pRefCount(sp._pRefCount){
++(*_pRefCount);
}
//sp1 = sp2,赋值操作符
SharedPtr<T>&operator=(const SharedPtr<T>&sp){
if(_ptr != sp._ptr){//是否是给自己赋值
// 释放管理的旧资源sp1
Release();
// 共享管理新对象的资源,并增加引用计数
_ptr = sp._ptr;
_pRefCount = sp._pRefCount;//这里只是一个浅拷贝
++(*_pRefCount);//共享同一片内存sp2
}
return *this;
}
T& operator*(){return *_ptr;}
T* operator->(){return _ptr;}
int UseCount(){return *_pRefCount;}
T* Get(){return _ptr;}
private:
void Release(){
// 引用计数先减1,如果减到0,则释放资源
if(--(*_pRefCount) == 0){
delete _ptr;
delete _pRefCount;
cout<<"资源释放了"<<endl;
//以防万一
_ptr = nullptr;
_pRefCount = nullptr;
}
}
private:
int*_pRefCount;//引用计数,注意这里不能写成引用,否则外面可以更改值,不安全
T* _ptr;//指向管理资源的指针
}
};
int main(){
bit::sharedPtr<int>sp1(new int(10));
bit::SharedPtr<int>sp2(sp1);
return 0;
}
shared_ptr的简单实现
最新推荐文章于 2024-01-26 20:00:00 发布