当前位置: 首页 > 网络应用技术

共享_PTR实施分析

时间:2023-03-07 19:16:14 网络应用技术

  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