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