关闭

shared_ptr 实现

202人阅读 评论(1) 收藏 举报

自己实现了一个菜得抠脚的shared_ptr ,

自己存草稿看看吧

template<class T>
struct Type{
	typedef T type;

};
class SPCountBase{
	public :
		int used_count_;
		void AddOne(){
			used_count_++;
			cout<<"add "<< used_count_<<endl;
		}
		void DecreaseOne(){
			used_count_--;
			cout<<"decreate "<< used_count_<<endl;
		}
		void Destory(){
			delete this;
		}
		int used_count(){
			return used_count_;
		}
		SPCountBase() :used_count_(1){}
		virtual ~SPCountBase() { }


};
template <class T>
class CountImpl : public SPCountBase{
	typedef CountImpl<T> this_type;
	public : 
		T * px_;
		CountImpl(T * p):  px_(p) {
			cout<<" CountImpl() "<<endl;   
		}
		~CountImpl() {  
			cout << "~CountImpl()" <<endl; 
				delete px_;}

};
class SharedCount{ //为什么要抽象出这个count来
	public:
		SPCountBase * pi_;	

		template <class T> 
		SharedCount( T *p){
			pi_ = new CountImpl<T>(p);
		}
		SharedCount( ) : pi_(){
		}
		~SharedCount(){
			if(pi_){
				pi_->DecreaseOne();
				if(pi_->used_count() == 0){
					delete pi_;	
				}
			}	
		}

};
template <class T>
class MyShared {
	public :
		T * px_; //保存的是原始指针的内容
		SharedCount  pn_;//处理引用计数问题
		MyShared (){
		
		
		}
		template <class X>
		MyShared ( X *p) : px_(p) , pn_(p) {

		
		}
		MyShared &operator = (MyShared <T> const &r){
			px_ = r.px_;
			pn_.pi_ = r.pn_->pi_;
			dynamic_cast< CountImpl<T> *> (pn_.pi_)->px_ = 
				dynamic_cast< CountImpl<T> *>(r.pn_->pi_)->px_;
			pn_.pi_->AddOne();
			return *this;
		}
		MyShared (MyShared <T> const &r){
			px_ = r.px_;
			pn_.pi_ = r.pn_.pi_;
			dynamic_cast< CountImpl<T> *> (pn_.pi_)->px_ = 
				dynamic_cast< CountImpl<T> *>(r.pn_.pi_)->px_;
			pn_.pi_->AddOne();
		}

};
class Test{
	public :
		Test(){
			cout<<"Test()"<<endl;
		}
		~Test(){
			cout<<"~Test()"<<endl;
		}

};
int main()
{
	Test *s = new Test();
	MyShared <Test>  ss0(s);
	MyShared <Test>  ss1(ss0);
	MyShared <Test>  ss2(ss0);

}


0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14807次
    • 积分:722
    • 等级:
    • 排名:千里之外
    • 原创:55篇
    • 转载:23篇
    • 译文:2篇
    • 评论:6条
    最新评论