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是一种智能指针数据结构,除了具有智能指针的基本功能——自动管理资源释放外,还有一个特征就是"share",我理解所谓的“share”就是多个shared_ptr共同分享同一处资源,...
  • lichengyu
  • lichengyu
  • 2013年12月06日 21:05
  • 1805

shared_ptr源码解读

shared_ptr源码解读rayleahaan@hotmail.com1  介绍众所周知,auto_ptr由于它的破坏性复制语义,无法满足标准容器对元素的要求,因而不能放在标准容器中;如果我们希望当...
  • hansoft
  • hansoft
  • 2004年04月15日 16:07
  • 3873

智能指针原理分析与自己的shared_ptr实现

原理分析内存管理历来是C++编程的一项需要小心费力气的活,因为C++本身不带GC机制,所有的内存管理都需要我们手动实现,从malloc / free 到new / delete,再到allocator...
  • huoyefeiwu
  • huoyefeiwu
  • 2015年05月29日 00:05
  • 2311

shared_ptr源码分析

shared_ptr与scoped_ptr一样包装了new操作符在堆上分配的动态对象,但它实现的是引用技术型的智能指针,可以自由地被拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0时)它才...
  • FreeeLinux
  • FreeeLinux
  • 2017年01月21日 20:36
  • 1494

智能指针的模拟实现shared_ptr 循环引用 定置删除器

auto_ptr与scoped_ptr的实现见本人的上篇博客。三、shared_ptrshared_ptr的实现原理是通过引用计数来实现,只有当引用计数为1时才释放空间,否则只需将引用计数减1.拷贝和...
  • fucangzxx
  • fucangzxx
  • 2016年05月29日 21:36
  • 825

借助shared_ptr实现copy-on-write以提高多线程并发性能

锁竞争是服务器性能四大杀手之一(其他三个是:数据拷贝、环境切换、内存分配),本文将基于之前发布的kimgbo网络I/O库,以一个多线程群发聊天服务器的实现为例,介绍如何借助shared_ptr提高多线...
  • kimg_bo
  • kimg_bo
  • 2016年02月08日 15:30
  • 1266

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

shared_ptr实现COW(Copy-On-Write)
  • zhangxiao93
  • zhangxiao93
  • 2016年10月11日 22:53
  • 973

C++11智能指针之使用shared_ptr实现多态

指针除了管理内存之外,在C++中还有一个重要的功能就是实现多态。 代码很简单,还是使用虚函数。与原生指针并没有什么区别: #include #include using namespace std...
  • wks19891215
  • wks19891215
  • 2016年03月27日 13:37
  • 2725

shared_ptr智能指针模板类的简单实现(c++11)

前言 最近突然萌生把stl常用的库都通通自己过一遍的想法,算是对泛型编程的一次学习,也深入理解stl,还是对c++11知识的练习,就从智能指针开始吧。 另外,c++11让c++程序变得简洁优...
  • to_be_better
  • to_be_better
  • 2016年12月11日 04:51
  • 999

boost shared_ptr实现浅析

版本boost 1.43.0 头文件 shared_ptr是boost中最强大的智能指针,基于C++非常精巧的实现了“引用计数”的功能 shared_ptr只有两个类成员变量 T ...
  • vinowan
  • vinowan
  • 2011年11月06日 20:06
  • 1611
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:shared_ptr 实现
举报原因:
原因补充:

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