在什么意义上,weak_ptr拥有'一个shared_ptr?

时间:2018-06-12 14:02:21

标签: c++ c++11 shared-ptr weak-ptr make-shared

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

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

enter image description here

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

  

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

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

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

2 个答案:

答案 0 :(得分:5)

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

因此,在所有shared_ptr s 所有weak_ptr被破坏之前,无法取消分配控制块。如果你使用make_shared控制块并且对象被分配在一起,这主要是一个优化,除了,如果该对象在任何weak_ptr中都过时了。

答案 1 :(得分:2)

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

所有权意味着:

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

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

相关问题