【发布时间】:2020-07-29 14:34:26
【问题描述】:
我是 C++ 的新手,我正在尝试实现一个树结构,但我遇到了一个分段错误,该错误在删除树时出现。 这段代码很简单,我有一个 Node 类,其中包含指向其子节点的指针。
#include <vector>
class Node
{
public:
int data1, data2;
std::vector<Node*> children;
Node* add_child(double data1, double data2)
{
Node* n = new Node(data1, data2);
children.push_back(n);
return n;
}
Node(double data1, double data2)
:data1(data1), data2(data2)
{ }
~Node()
{
for(auto child : children)
{
delete child;
}
children.clear();
}
};
int main()
{
Node root = Node(0, 0);
Node* n = &root;
for(int i = 0; i < NB; ++i)
{
n = n->add_child(0, 0);
}
}
main 创建了一个很简单的结构,但是有错误就足够了。仅当 NB 的值大于 170 000 时才会发生 seg 错误。
【问题讨论】:
-
递归销毁和 170 000 个节点听起来你可能会溢出堆栈。
-
销毁发生在析构函数中,而不是在那个循环中。而且销毁是递归的。
-
树结构不应该被递归删除,而不是根节点应该以非递归方式收集所有后代,清除它们的
children向量,然后删除这些节点。 -
@t.niese 我应该有一个
remove方法来做到这一点吗?我需要能够删除所有节点,而不仅仅是根。然后这个方法会收集它所有的孩子,然后调用每个孩子的析构函数(这将是空的)?
标签: c++ pointers segmentation-fault