• 一个shared_ptr的简易实现


    #include<iostream>
    
    
    class SharedCount{
    public:
    	SharedCount():count_(1){}
    	void AddCount(){
    		++count_;
    	}
    	long ReduceCount(){
    		return --count_;
    	}
    	long GetCount() const{
    		return count_;
    	}
    
    	template<typename T>
    	friend class SharedPtr;
    
    private:
    	long count_;
    };
    
    
    template<typename T>
    class SharedPtr{
    public:
    	explicit SharedPtr(T *ptr=nullptr):ptr_(ptr){
    		if(ptr_){
    			rel_ = new SharedCount();
    		}else{
    			rel_ = nullptr;
    		}
    	};
    
    	~SharedPtr(){
    		if(rel_ && !rel_->ReduceCount()){
    			delete ptr_;
    			delete rel_;
    		}
    	}
    
    	SharedPtr(const SharedPtr& other){
    		rel_ = other.rel_;
    		if(rel_){
    			rel_->AddCount();
    		}
    		ptr_ = other.ptr_;
    	}
    
    
    	SharedPtr(SharedPtr&& other){
    		ptr_ = other.ptr_;
    		rel_ = other.rel_;
    
    		other.ptr_ = nullptr;
    		other.res_ = nullptr;
    	}
    
    	SharedPtr& operator=(SharedPtr& rhs){
    		if(ptr_ != rhs.ptr_){
    			if(rel_ && !rel_->ReduceCount()){
    				delete ptr_;
    				delete rel_;
    			}
    			rhs.rel_->AddCount();
    			ptr_ = rhs.ptr_;
    			rel_ = rhs.rel_;
    		}
    
    		return *this;
    	}
    
    	T* Get() const{
    		return ptr_;
    	}
    
    	long UseCount() const{
    		if(ptr_){
    			return rel_->GetCount();
    		}else{
    			return 0;
    		}
    	}
    
    
    	T& operator*() const{
    		return *ptr_;
    	}
    	T* operator->() const{
    		return ptr_;
    	}
    	operator bool() const{
    		return ptr_;
    	}
    
    
    private:
    	T *ptr_;
    	SharedCount *rel_;
    };
    
    
    int main(){
    	SharedPtr<int> sp1(new int(5));
    	SharedPtr<int> sp2;
    	std::cout << "sp1.use_count:  " << sp1.UseCount() << std::endl;
    	std::cout << "sp2.use_count:  " << sp2.UseCount() << std::endl;
    
    	sp2 = sp1;
    	std::cout << "sp1.use_count:  " << sp1.UseCount() << std::endl;
    	std::cout << "sp2.use_count:  " << sp2.UseCount() << std::endl;
    
    	SharedPtr<int> sp3(sp2);
    	std::cout << "sp1.use_count:  " << sp1.UseCount() << std::endl;
    	std::cout << "sp2.use_count:  " << sp2.UseCount() << std::endl;
    	std::cout << "sp3.use_count:  " << sp3.UseCount() << std::endl;
    
    	return 0;
    }

  • 相关阅读:
    程序员之痛:几千行代码能搞定的为什么要写几万行?
    python基础===新式类与经典类
    python基础===装饰器@property 的扩展
    java===java基础学习(16)---final
    java===java基础学习(15)---抽象,接口
    python基础===继承和多继承
    python基础===类的私有属性(伪私有)
    python基础===创建大量对象是节省内存方法
    java===java习题---Josephu问题
    java===java基础学习(14)---封装
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/16030558.html
Copyright © 2020-2023  润新知