a weak_ptr 'own' a shared_ptr 在什么意义上?

In what sense does a weak_ptr 'own' a shared_ptr?

我尝试为这个问题写标题大约 10 分钟,正如您将看到的,我最终失败了。 [编者注:我想我已经解决了这个问题。]

我正在阅读 Herb Sutter's blog 并且该主题使用 std::make_shared 及其利弊。请参阅所附照片:

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

A “weak reference” count to track the number of weak_ptrs currently observing the object. The shared housekeeping control block is destroyed and deallocated (and the shared object is deallocated if it was not already) when the last weak reference goes away.**

我不是很理解这个说法。最初当我们通过 make_shared 创建一个 std::shared_ptr 时,例如auto sp1 = make_shared<widget>();,目前没有观察到 sp1 的弱点,所以当 shared_ptr 以通常的方式超出范围时,它将被删除。

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

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

因此,在所有 shared_ptr 所有 weak_ptr 都被销毁之前,无法取消分配控制块。如果你使用 make_shared 控制块和对象一起分配,这主要是一种优化, 除了 如果对象被任何 weak_ptrs 超过。

简单地说,shared_ptr拥有管理对象和元信息(控制块),而weak_ptr只拥有元信息。

所有权意味着:

  • 当资源拥有所有者时,它不会被销毁(或者 "freed" 以拥有者 "smart pointer" 构建时确定的方式);
  • 当所有所有者的生命周期结束时,资源为destroyed/freed。

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