C ++智能指针循环链接

时间:2014-02-25 14:49:32

标签: c++ shared-ptr smart-pointers circular-reference

我有两种类型:A& B. 一个'聪明'点B和B'聪明'点A. 在主范围内,我有一个指向A的智能指针。

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中,只有一个指针从主范围指向这个结构。我希望在释放此指针后删除此结构。

2 个答案:

答案 0 :(得分:6)

对于可能存在循环依赖但不进行架构重构的地方,最好使用weak_ptrshared_ptr

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

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

};

答案 1 :(得分:6)

在某处使用weak pointer来打破循环 - 它专为这种情况而设计。

  

此外,std::weak_ptr用于打破std::shared_ptr

的循环引用