使用shared_ptr和weak_ptr以及树的循环引用

时间:2014-06-18 17:35:24

标签: c++

我希望我不是双重发布...我正在尝试解决“树/图”构建问题,其中每个节点可以有任意数量的父母和子女,并且也可以拥有自己的父母作为其中一个儿童。所以施工问题非常简单,没问题。问题是内存释放。让我解释。以下是我的节点类的定义方式:

class Node{
public:
    // A bunch of utility functions and an empty virtual destructor (only a 
    // printf there)
private:
    std::list<shared_ptr<Node>> m_children;
    std::list<weak_ptr<Node>> m_parents; // To avoid circular references
}

当我的节点是其父节点之一的父节点时,就会出现问题。更确切地说,我怀疑只要节点是从起始节点到其路径中的任何节点的父节点,就会发生这种情况......由于循环引用,对象不会被释放...

我尝试通过添加此成员来解决问题:

std::list<weak_ptr<Node>> m_weakChildren;

如果已经在父路径中,我将弱引用添加到我要添加的子项中。现在,从逻辑上讲,当你考虑它时,由于父对象被破坏,我得到了一个分段错误。

有没有人知道如何解决我的问题?非常感谢!

辅助问题:管理树的类还有一个类,它使用shared_ptr为节点编制索引以便快速查找。可悲的是,这个类在树本身之前被摧毁了。问题是:我们怎样才能知道哪些班级成员首先被摧毁?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

std::shared_ptr 是适合的节点解决方案 图表(即使图表是非循环的)。图应该是 由更高级别的结构(class Graph?)管理,以及此 结构应该管理内存。 (或者......你可以使用 Boehm垃圾收集器。图表是垃圾的一件事 收藏家在管理方面非常擅长 所有来自亲垃圾收集的基准测试的原因 人们使用广泛的图表。)

相关问题