1

我认为我的问题类似于shared_ptr 和 weak_ptr 差异,但我有兴趣了解它们如何协同工作,而不是差异列表。

维基百科关于shared_ptr 和 weak_ptr state a的页面weak_pointer可以用来解决循环依赖问题,它给出了一个例子:

std::shared_ptr<int> p1(new int(5));
std::weak_ptr<int> wp1 = p1; //p1 owns the memory.

{
  std::shared_ptr<int> p2 = wp1.lock(); //Now p1 and p2 own the memory.
  if(p2) //Always check to see if the memory still exists
  { 
    //Do something with p2
  }
} //p2 is destroyed. Memory is owned by p1.

p1.reset(); //Memory is deleted.

std::shared_ptr<int> p3 = wp1.lock(); //Memory is gone, so we get an empty shared_ptr.
if(p3)
{
  //Will not execute this.
}

但我没有看到循环依赖,所以我不明白如何weak_pointer解决问题。

我本来希望看到一些 objecta指向一个 object b,并b以某种方式指向aweak_ptr在一个有向图边缘之间有一个垫片以打破链)。

这个例子是好的,我的想法是坏的吗?还是有更好的问题和解决方案示例?

4

1 回答 1

1

在当前版本的维基百科页面中,该示例旨在展示std::weak_ptr一般的使用,而不是特别消除强循环引用。(循环引用仅在给出示例后才提及

该示例显示的是wp1,尽管它有生命周期,但它并不拥有 指向的内存p1,并且一旦重置,它就会wp1正确检测到该内存的删除。p1换句话说,wp1既不会干扰动态分配对象的删除,也不会在通过弱指针(正确)访问已删除对象时导致未定义的行为。

因为它们不干扰解除分配,所以弱指针不仅可用于避免引用循环,而且可用于实现存储附加属性或缓存现有对象的计算属性的关联数组。由于此类缓存不会干扰解除分配,因此它们可以依赖于在不再使用时删除主要对象,而无需特定于缓存的驱逐策略。

于 2014-12-16T07:36:21.900 回答