shared_ptr 实现

原创 2016年06月01日 15:30:51

自己实现了一个菜得抠脚的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);

}


版权声明:本文为博主原创文章,转载请注明本页链接。

相关文章推荐

shared_ptr 的简单实现

如果对shared_ptr是什么不是很清楚,可以百度或是参考C++primer等参考书。 文章只是对其进行了一个简单实现,来模拟shared_ptr的功能。...

理解 shared_ptr实现copy-on-write(COW)

shared_ptr实现COW(Copy-On-Write)

boost shared_ptr实现浅析

版本boost 1.43.0 头文件 shared_ptr是boost中最强大的智能指针,基于C++非常精巧的实现了“引用计数”的功能 shared_ptr只有两个类成员变量 T ...
  • vinowan
  • vinowan
  • 2011年11月06日 20:06
  • 1570

boost::shared_ptr 分析与实现

引用地址:http://www.cnblogs.com/gadfly/archive/2010/09/27/1836992.html     http://blog.chinaunix.net/...

C++ 智能指针shared_ptr模板实现原理

C++ 智能指针shared_ptr通过引用计数来管理指向的对象,不需要人工释放 这篇博文主要是讲解了智能指针的实现原理,怎么实现引用计数 #include using namespace s...
  • szqsdq
  • szqsdq
  • 2017年05月07日 15:07
  • 303

智能指针(二):shared_ptr实现原理

前面讲到auto_ptr有个很大的缺陷就是所有权的转移,就是一个对象的内存块只能被一个智能指针对象所拥有.但我们有些时候希望共用那个内存块.于是C++ 11标准中有了shared_ptr这样的智能指针...

智能指针shared_ptr实现

若要使用到项目, 请将 引用计数类 的引用计数增减使用原子操作.  以下代码有些细节问题, 修正后的代码参见: https://gist.github.com/2986880 namesp...

C++简单版shared_ptr智能指针的实现

sp_counted_base.h#pragma once class sp_counted_base//管理对象引用计数 { public: sp_counted_base() :count...

[C++]Shared_ptr使用详解&&实现链表

Shared_ptr使用详解 在之前参加项目时,有一条准则为不使用原生态指针,而使用智能指针。那么我将在本文中介绍shard_ptr的内容。本文分两个部分组成,第一部分是讲解shard_ptr的使...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:shared_ptr 实现
举报原因:
原因补充:

(最多只允许输入30个字)