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