shared_ptr,shared_ptr,enable_shared_from_this的理解

0.shared_ptr和weak_ptr的实现方案
说明:该方案完全是我自己YY出来的,是为了方便自己的理解智能指针的。另外,也帮助理解enable_shared_from_this。
 
1.背景
为了方便管理动态分配的内存,让申请的内存自动释放,天才们提出了智能指针的方法。
既然你创造了一种新的技术,老的问题必将以新的形态出现。
这里我指关注一个问题:
如何使用智能指针?
1.1 基本使用(shared_ptr)
1.2 监控使用(shared_ptr)
1.3 内部使用(enable_shared_from_this)
 
2.实现
 
shared_ptr(每个都包含有指向Counter的指针)
 
 
Counter(包含shared_ptr和weak_ptr分别的计数,还包含“内存指针”)
weak_ptr(每个都包含有指向Counter的指针)
 
 
enable_shared_from_this(继承该类的子类对象都包含了一个weak_ptr)
 
2.1 shared_ptr
  • 只有第一个shared_ptr才生成一个Counter,并将内存指针放到Counter中,shared_ptr计数+1 。
  • 之后又新的针对该内存指针的shared_ptr,都必须拷贝的方式获得指向Counter的指针,并且shared_ptr计数+1 。
  • 每销毁一个shared_ptr的时候,Counter的shared_ptr计数-1,当shared_ptr计数为0时,销毁内存
  • 当shared_ptr计数和weak_ptr计数同时为0时,销毁Counter
 
2.2 weak_ptr
  • 当shared_ptr计数>0的时候,可以通过weak_ptr获得一个shared_ptr,当然shared_ptr计数+1 。
  • 没销毁一个weak_ptr的时候,weak_ptr计数-1,
  • 当shared_ptr计数和weak_ptr计数同时为0时,销毁Counter
 
2.3 Counter
  • 存放了shared_ptr和weak_ptr计数
  • 存放了 内存指针
 
2.4 enable_shared_from_this
  • 当继承该类的子类对象指针构造shared_ptr的时候,该对象可以获得一个weak_ptr
  • 当该子类对象需要传递自身指针给其他人使用的时候,必须传递一个shared_ptr

posted on 2016-02-18 15:58  bluebbc  阅读(215)  评论(0编辑  收藏

导航

统计