我希望我不是双重发布...我正在尝试解决“树/图”构建问题,其中每个节点可以有任意数量的父母和子女,并且也可以拥有自己的父母作为其中一个儿童。所以施工问题非常简单,没问题。问题是内存释放。让我解释。以下是我的节点类的定义方式:
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为节点编制索引以便快速查找。可悲的是,这个类在树本身之前被摧毁了。问题是:我们怎样才能知道哪些班级成员首先被摧毁?
感谢您的帮助!
答案 0 :(得分:3)
std::shared_ptr
不是适合的节点解决方案
图表(即使图表是非循环的)。图应该是
由更高级别的结构(class Graph
?)管理,以及此
结构应该管理内存。 (或者......你可以使用
Boehm垃圾收集器。图表是垃圾的一件事
收藏家在管理方面非常擅长
所有来自亲垃圾收集的基准测试的原因
人们使用广泛的图表。)