关于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过来的,能够较好看清楚各个类之间的关系。

关于boost的shared_ptr以及weak_ptr的研究_第1张图片


简单介绍:

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的分析对比

你可能感兴趣的:(boost)