shared_ptr是一种告别C ++++以提供简单对象管理的工具。GCC4.9中共享_ptr的实现,以及与shared_ptr相关的几个概念,以在源代码中找到源代码的答案
此处仅列出了一些源代码
shared_ptr.h
shared_ptr只是一个外壳,提供外部呼叫接口,实际实现位于__shared_ptr base类中
__SHARED_PTR<>
_lock_policy是一种在计数操作中使用锁的策略
__SHARED_COUNT<>
构造函数:
复制结构
分配值结构:
破坏
可以看出,__ shared_count位于构造函数中,订购_m_use_count和_m_use_count为1,并且在复制和分配结构中只添加1个添加到_M_USE_COUNT中。
_sp_counted_base<_lp> 实现两个计数的安全读写 /添加 /释放,执行计数器的原子操作,然后在共享_ptr桩上发布资源。
enum _lock_policy {_s_single,_s_mutex,_s_atomic};
_lock_policy在不同情况下将默认策略默认为宏来定义三个枚举之一
_m_use_count是共享计数
_m_weak_count是一个弱参考数量
函数实现主要取决于某些构造函数实现
构造函数
复制结构
复制结构,直接使用参数给出数据指针值,调用_m_refcount的复制构造函数
动员
右 - 值移动构造函数
任务
分配功能:
移动分配结构
移动分配构造函数的实施:
destructor shared_ptr/__ shared_ptr的destructor未显示它,也就是说,默认分析函数称为
默认分析功能将做什么
已分析了共享_Count部分。呼叫__shared_count退化函数将调用shared_count_base _m_release()以同时释放数据空间并计数。规则是:
定义fear_ptr是一个弱参考。它具有对由shared_ptr管理的对象的非遗物引用。对于两个应用程序方案
该定义相对简单,其定义和所有实现方法:
它仅定义某些结构功能,而lock()方法用于确定是否释放了引用的共享_ptr对象
其中,构造函数只能构造空的弱_ptr,并将feam_ptr/shared_ptr使用用于结构。
类似于shared_ptr的定义,只是从__shared_count替换为feek_count,__weak_count定义如下。它的成员变量与shared_count相同,但是在成员函数的操作中,您可以看到它仅操作_m_weak_count等,没有处理m_use_count
如上所述,不考虑循环引用的问题,feal_ptr似乎被用作智能指针,但实际上是不可能的。原因是该方法已实现:
众所周知,可以防止共享_ptr可能导致周期参考问题的周期参考。那么fear_ptr如何解决周期参考的问题?请参见一个示例
显然,由于A和B互相引用,因此他们无法彼此释放,从而导致内存泄漏(例如,请参阅博客)
如何打破此周期参考?cppreference的陈述是
特定修改方法:
A类成员AB(或B类)的类型从共享_ptr修改为neak_ptr。这两种方法之间有什么区别?也就是说,结构的顺序会有所不同,并且在拥有wek_ptr对象后将发布它
从源代码实现的角度来看,为什么在将成员类型的类型修改为feek_ptr之后,类a / b a / b破坏性函数成功地称为?
以同样的方式,如果我们不使用fief_ptr,最终的SPA和SPB _M_USE_COUNT为2,调用shad_ptr destructor,_sp_counted_base无法将其降低到0,则无法降低,不会被破坏。
shared_ptr提供了构造函数的接口
__SHARED_PTR
enable_shared_from__this主要解决问题:
派生类可以创建共享_ptr,让他指向现有的共享_ptr共享所有权
使用:
使用neak_ptr构造__shared_ptr:
要添加……
原始:https://juejin.cn/post/7099802726952402951