我试图为这个问题编写一个标题,就像10分钟一样,你会看到我最终失败了。 [编者注:我认为我已经解决了这个问题。]
我正在阅读Herb Sutter's blog,主题是使用std :: make_shared及其缺点和优点。请看附上的照片:
这是非常有趣的article的一小部分,我强烈建议人们阅读。我的问题是关于这句话:
“弱引用”计数用于跟踪当前正在观察对象的weak_ptrs的数量。当最后一个弱引用消失时,共享内务控制块被销毁并解除分配(如果共享对象尚未释放,则将其释放)。**
我真的不明白这句话。最初,当我们按std::shared_ptr
创建make_shared
时,例如auto sp1 = make_shared<widget>();
,当前没有弱ptrs正在观察sp1,因此当shared_ptr
以通常的方式超出范围时,它将被删除。
那么添加弱引用如何改变这种行为?有人能解释一下吗?
答案 0 :(得分:5)
控制块跟踪所有weak_ptr引用以及shared_ptr引用。毕竟,weak_ptr需要在某处看看对象是否仍然有效。
因此,在所有shared_ptr
s 和所有weak_ptr
被破坏之前,无法取消分配控制块。如果你使用make_shared
控制块并且对象被分配在一起,这主要是一个优化,除了,如果该对象在任何weak_ptr
中都过时了。
答案 1 :(得分:2)
简单地说,shared_ptr
拥有托管对象和元信息(控制块),而weak_ptr
只拥有元信息。
所有权意味着:
引用计数部分是实现细节。 (如果你喜欢使用互斥体而不是相对有效的原子计数器实现非常低效的实现,你可以有一个链表。)