C++面试题:手撕智能指针shared_ptr

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;
};
经验分享 程序员 微信小程序 职场和发展