2

我试图为这个问题写一个标题大约 10 分钟,你会看到我最终失败了。[编者注:我想我已经解决了这个问题。]

我正在阅读Herb Sutter 的博客,主题是使用 std::make_shared 及其优缺点。请看附上的照片:

在此处输入图像描述

这是一篇非常有趣的文章的一小部分,我强烈建议人们阅读。我的问题是关于这句话:

一个“弱引用”计数,用于跟踪当前观察对象的weak_ptrs 数量。当最后一个弱引用消失时,共享内务控制块被销毁和释放(如果共享对象尚未释放,则共享对象被释放)。**

我真的不明白这个说法。std::shared_ptr最初,当我们通过make_sharedeg创建 a 时,当前没有观察 sp1 的弱 ptrs,因此当以通常的方式超出范围auto sp1 = make_shared<widget>();时,它将被删除。shared_ptr

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

4

2 回答 2

5

控制块跟踪所有weak_ptr 引用以及shared_ptr 引用。毕竟,weak_ptr 需要在某个地方查看对象是否仍然有效。

shared_ptr因此,在所有s所有weak_ptrs 都被销毁之前,不能释放控制块。如果使用make_shared控制块和对象一起分配,这主要是一种优化,除非对象被任何weak_ptrs 延长。

于 2018-06-12T14:11:50.437 回答
2

简单地说,ashared_ptr 拥有被管理对象和元信息(控制块),aweak_ptr只拥有元信息。

所有权意味着:

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

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

于 2018-06-12T21:50:54.493 回答