代码之家  ›  专栏  ›  技术社区  ›  Eduard Rostomyan

弱者在什么意义上“拥有”了一个共享的私人关系?

  •  2
  • Eduard Rostomyan  · 技术社区  · 6 年前

    我试着为这个问题写了大概10分钟的标题,你会看到我最终失败了。[编者按:我想我已经修好了。]

    我在看书 Herb Sutter's blog 主题是使用STD::它的优点和缺点。请看所附照片:

    enter image description here

    这是一个非常有趣的 article 我强烈推荐人们阅读。我的问题是关于这句话:

    “弱引用”计数以跟踪当前观察对象的弱ptr的数量。当最后一个弱引用消失时,共享内务管理控制块将被销毁和解除分配(如果共享对象还没有被解除分配)。**

    我真的不明白这句话。最初当我们创建 std::shared_ptr 通过 make_shared 例如 auto sp1 = make_shared<widget>(); ,当前没有弱ptr正在观察sp1,因此当 shared_ptr 以通常的方式超出范围。

    那么,添加弱引用如何改变这种行为呢?有人能给我解释一下吗?

    2 回复  |  直到 6 年前
        1
  •  5
  •   ravnsgaard    6 年前

    控制块跟踪所有弱的ptr引用以及共享的ptr引用。毕竟,弱者需要看看 在某处 查看对象是否仍然有效。

    因此,在 shared_ptr S 全部的 weak_ptr 已经被摧毁了。如果你使用 make_shared 控制块和对象一起分配,这主要是一种优化, 除了 如果对象比任何 弱者PTR S.

        2
  •  2
  •   curiousguy    6 年前

    简单地说,一个 shared_ptr 拥有 托管对象和元信息(控制块)以及 weak_ptr 只拥有元信息。

    所有权是指:

    • 当一个资源有所有者时,它不会被销毁(或者以构造拥有的“智能指针”时确定的方式“释放”);
    • 当所有所有者的生命周期结束时,ressource被销毁/释放。

    引用计数部分是一个实现细节。(如果您喜欢使用互斥锁而不是相对高效的原子计数器来实现非常低效的实现,则可以使用链表。)