【问题标题】:C++ smart pointer circular link [duplicate]C ++智能指针循环链接[重复]
【发布时间】:2014-02-25 14:49:31
【问题描述】:

我有两种类型:A 和 B。 A“聪明”点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 中,一个在主勺中)。

这是一个简单的例子。实际上,我有两种以上的类型和更多的指针。 可以想象一个大的对象结构在 RAM 中相互指向,而主作用域中只有一个指向该结构的指针。一旦这个指针被释放,我希望这个结构被删除。

【问题讨论】:

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


【解决方案1】:

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

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

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

};

【讨论】:

    【解决方案2】:

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

    另外,std::weak_ptr是用来打破std::shared_ptr的循环引用

    【讨论】:

      猜你喜欢
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 2019-06-30
      • 1970-01-01
      相关资源
      最近更新 更多