template<class T>
class SmartPtr{
public:
SmartPtr(T* ptr = NULL): _ptr(ptr), _pcount(new int(1)) {} //构造函数
SmartPtr(const SmartPtr& s): _ptr(s.ptr), _pcount(s._pcount){ //拷贝构造函数
*(_pcount)++; //用指针进行count操作能够方便控制不同智能指针对象的计数值
}
SmartPtr<T>& operator=(const SmartPtr& 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;
}
~SmartPtr(){ //析构函数要进行判定,count为0才会delete,delete之后避免野指针要赋值nullptr
--(*(this->_pcount));
if(this->_pcount == 0){
delete _ptr;
_ptr = nullptr;
delete _pcount;
_pcount = nullptr;
}
}
private:
T* _ptr;
int* _pcount;
};
C++面试题:手撕智能指针shared_ptr
最新推荐文章于 2024-05-30 00:21:57 发布