笔记
-
weak_ptr构造函数需要传入一个shared_ptr指针。weak_ptr会保存shared_ptr指向的内存指针,但不能直接取出此指针,要通过weak_ptr::lock()获取到对应的shared_ptr对象。
-
weak_ptr不会增加shared_ptr的引用计数,weak_ptr引用计数指针指向的是shared_ptr的引用计数内存。智能指针引用计数内存有俩个计数:_Uses、_Weaks。weak_ptr会增加_Weaks的值。当_Uses及_Weaks均为0时,引用计数内存才会被释放,可参见后文代码。
-
基于以上事实可知,可通过weak_ptr::expired()函数判断其跟踪的shared_ptr是否已被释放。
引用计数类
// CLASS _Ref_count_base
class _Ref_count_base
{ // common code for reference counting
private:
virtual void _Destroy() = 0;
virtual void _Delete_this() = 0;
private:
_Atomic_counter_t _Uses;
_Atomic_counter_t _Weaks;
//省略...
void _Decref()
{ // decrement use count
if (_MT_DECR(_Mtx, _Uses) == 0)
{ // destroy managed resource, decrement weak reference count
_Destroy();
_Decwref();
}
}
void _Decwref()
{ // decrement weak reference count
if (_MT_DECR(_Mtx, _Weaks) == 0)
_Delete_this();
}
//省略...