关于boost的shared_ptr以及weak_ptr的研究

boost的智能引用计数指针shared_ptr,其当引用计数为0,就会执行delete p;删除堆中分配的对象。

另外由于众所周知的引用计数循环导致内存泄漏的问题,可以考虑采用weak_ptr。

weak_ptr可以防止循环引用导致内存泄漏,内部实现采用啦shared_ptr不同的引用计数(但实际上都是指向同一个内部实现类sp_counted_base)。如果想从weak_ptr访问指针,可以调用lock方法,这时增加引用计数,返回对应shared_ptr。


这张图从别人文章copy过来的,能够较好看清楚各个类之间的关系。



简单介绍:

class sp_counted_base
//负责不同平台的INTERLOCKED_INCREMENT/INTERLOCKED_DECREMENT
:
use_count_( 1 ), weak_count_( 1 )
//use_count是shared引用计数

//weak_count是weak引用计数


                                       ||

                     
class sp_counted_impl_p : public sp_counted_base
//重载new/delete操作符
//负责allocate/dellocate

                                    

                                       ||


class  shared_count                             class weak_count
:                                                            :

sp_counted_base *pi      <--------->      sp_counted_base* pi


          ||                                                              ||



class  shared_ptr                                  class  weak_ptr     
:                                                            :
T* p                                                       T* p

shared_count pn                                  weak_count pn


对应代码网址:

http://www.boost.org/doc/libs/1_53_0/boost/smart_ptr/weak_ptr.hpp

http://www.boost.org/doc/libs/1_53_0/boost/smart_ptr/detail/shared_count.hpp

http://www.boost.org/doc/libs/1_53_0/boost/smart_ptr/detail/sp_counted_impl.hpp

http://www.boost.org/doc/libs/1_53_0/boost/smart_ptr/detail/sp_counted_base_w32.hpp

http://www.boost.org/doc/libs/1_53_0/boost/smart_ptr/shared_ptr.hpp


以后考虑增加对android framework实现的sp,wp的分析对比

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值