gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:45:37 29 4
gpt4 key购买 nike

我希望我没有重复发布...我正在尝试解决“树/图”构造问题,其中每个节点可以有任意数量的父节点和子节点,也可以有自己的父节点作为其节点之一 child 。所以构造问题非常简单,没有问题。问题是内存释放。让我解释。这是我的节点类的定义方式:

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 inode 以便快速查找的类。可悲的是,这个类在树本身之前就被破坏了。问题是:我们如何知道哪些类成员要先销毁?

感谢您的帮助!

最佳答案

std::shared_ptr 不是 中节点的合适解决方案图(即使图是非循环的)。图表应该是由更高级别的结构(class Graph?)管理,这结构应该管理内存。 (或者......你可以使用Boehm 垃圾收集器。图表是垃圾的一回事收藏家特别擅长管理——有支持垃圾收集的所有基准的原因人们使用大量图表。)

关于c++ - 使用 shared_ptr 和 weak_ptr 以及树的循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24291773/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com