shared_ptr,weak_ptr和循环依赖

时间:2014-01-13 10:51:11

标签: c++ shared-ptr circular-dependency weak-ptr

我认为我的问题类似于shared_ptr and weak_ptr differences,但我很想知道它们是如何协同工作而不是差异列表。

Wikipedia在shared_ptr and weak_ptr上的页面状态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如何解决问题。

我原本希望看到一些对象a指向一个对象bb指向a(一个weak_ptr已整理在其中一个有向图边缘之间打破链条。)

这个例子好吗,我的想法不好?或者有更好的问题和解决方案的例子吗?

1 个答案:

答案 0 :(得分:1)

在当前版本的维基百科页面中,该示例旨在演示一般std::weak_ptr的使用,特别是没有消除强循环引用。 (循环引用仅在示例出现之后提及。)

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

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