在经历过shared_ptr源码分析之后,我们接下来继续分析weak_ptr。weak_ptr是作为shared_ptr的补充而出现的,用于避免循环引用问题。
weak_ptr结构与shared_ptr近乎一致,这里直接写出部分结构和关键函数。
- weak_ptr<_Tp>继承自__weak_ptr<_Tp>,其主要功能都在__weak_ptr<_Tp>中实现。
- __weak_ptr包含数据成员
element_type* _M_ptr;
和__weak_count<_Lp> _M_refcount;
- weak_ptr和__weak_ptr的copy construct和operation=都为default。
综上我们不难看出其引用计数的维护依靠于成员变量__weak_count<_Lp> _M_refcount;
,所以我们之后将重点分析_M_refcount
。
构造分析
weak_ptr包含两个主要的构造函数,默认构造和通过shared_ptr
进行构造。让我们先来分析默认构造过程:
constexpr weak_ptr() noexcept = default;
weak_ptr直接调用default默认构造函数,其会调用基类__weak_ptr的默认构造函数。
constexpr __weak_ptr() noexcept
: _M_ptr(nullptr), _M_refcount()
{
}
__weak_ptr的默认构造就是对两个变量进行初始化,其中_M_ptr被赋值为nullptr,_M_refcount()调用默认构造。
constexpr __weak_count() noexcept : _M_pi(nullptr)
{
}
其数据成员_M_pi
被设置为nullptr, __weak_count中包含数据成员如下,此变量在shared_ptr中也出现了,这便是weak_ptr的如何与shared_ptr交互的本质。
_Sp_counted_base<_Lp>* _M_pi;
接下来分析通过shared_ptr进行构造的过程:
template<typename _Yp,
type