考虑以下代码。

using boost::shared_ptr;
struct B;
struct A{
    ~A() { std::cout << "~A" << std::endl; }
    shared_ptr<B> b;    
};
struct B {
    ~B() { std::cout << "~B" << std::endl; }
    shared_ptr<A> a;
};

int main() {
    shared_ptr<A> a (new A);
    shared_ptr<B> b (new B);
    a->b = b;
    b->a = a;

    return 0;
}

无输出. 无析构函数 叫做。内存泄漏。我一直相信智能指针有助于避免内存泄漏。

如果我需要在类中进行交叉引用该怎么办?

有帮助吗?

解决方案

如果你有这样的循环引用,一个对象应该持有一个 weak_ptr 到另一个,而不是一个 shared_ptr.

shared_ptr 介绍:

因为该实现使用了引用计数,所以循环 shared_ptr 实例将不会被回收。例如,如果 main() 持有一个 shared_ptrA, ,直接或间接持有 shared_ptr 回到 A, A的使用次数将为 2。破坏原作 shared_ptr 会离开 A 悬空,使用次数为 1。使用 weak_ptr 来“打破循环”。

谢谢格伦提供的链接。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top