2014-02-25 31 views
1

我有两个类型:A & B. A“巧妙”点B和B“巧妙”点A. 在主范围我有一个智能指针到A.C++智能指针圆形链路

class A; 
class B; 
typedef shared_ptr<A> pA; 
typedef shared_ptr<B> pB; 

class B { 
public: 
    B() {} 
    pA a; 
    virtual ~B() {cout << "delete b" << endl;} 
}; 

class A { 
public: 
    A() : b(new B()) {} 
    pB b; 
    virtual ~A() {cout << "delete a" << endl;} 
}; 

int main(int argc, char **argv) 
{ 
    { 
     pA pa(new A()); 
     pa->b->a = pa; 
    } 
    cout << "here" << endl; 

} 

我希望两个对象在范围的末尾被删除。 没有一个对象被删除,因为A有两个指向自己的指针(一个在b中,另一个在主要的勺子中)。 enter image description here

这是一个简单的例子。其实我有两种以上的类型和更多的指针。 可以想象,一个大对象结构指向彼此漂浮在RAM中,只有一个指针指向主结构。这个指针被释放后,我希望这个结构被删除。

+0

好的图纸的循环引用,爽! –

+0

相关:http://stackoverflow.com/questions/701456/what-are-potential-dangers-when-using-boostshared-ptr –

回答

6

对于可能出现循环依赖但重构架构的地方,最好使用weak_ptr以及shared_ptr

struct A { 
    std::shared_ptr<B> b; 
}; 

struct B { 
    std::weak_ptr<A> a; 

}; 
6

使用weak pointer某处打破循环 - 它的设计正是这种情况。

此外,std::weak_ptr是用来打破std::shared_ptr