2014-01-13 126 views
1

我认为我的问题与​​类似,但我很感兴趣的是看它们是如何一起工作的,而不是差异列表。shared_ptr,weak_ptr和循环依赖关系

维基百科上关于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指向对象b,和以某种方式b指回a(具有weak_ptr匀在有向图的一个边缘之间打破链)。

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

+0

“_state weak_pointer可以用来解决循环依赖问题_”,两者都是完全错误的;弱引用的用途很少,并且循环依赖不是一个 – curiousguy

回答

1

在维基百科页面的当前版本中,该示例旨在展示一般情况下std::weak_ptr的用法,特别是不消除强循环引用。 (循环引用只提到后的例子已经呈现。)

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

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