我正在使用树状结构。
树中的所有节点都保存在列表中,每个节点的子节点都保存在TreeNode对象中的TreeNode指针列表中。
这应该递归地擦除从给定节点开始的子树。
它从"节点"中删除TreeNode对象本身。列表,然后是子列表中的指针。
它工作正常,但是当我在IDE中使用内置调试器时,第一次使用(* i)调用destroySubtree时会出现段错误。当我正常运行程序时,它不会出现段错误,并且应该执行它应该执行的操作。 但这意味着我无法将调试器用于程序中的任何其他内容。 起初我认为它与我如何进行实际擦除有关,但它在destroySubtree的第一次递归调用中会出现段错误 - 在它进行任何擦除之前......
void Tree::destroySubtree(TreeNode* node)
{
if(node->children.size() == 0)
return;
list<TreeNode*>::iterator i;
for(i = node->children.begin(); i != node->children.end(); i++)
{
destroySubtree((*i)); //segfaults here, only when debugging
list<TreeNode>::iterator j;
for(j = nodes.begin(); j != nodes.end(); j++)
{
if((j)->nId == (*i)->nId)
{
nodes.erase(j);
break;
}
}
node->children.erase(i);
i--;
}
}
有谁知道为什么会这样,以及如何避免段错?
它失败了,stl_list.h:768如果有帮助吗?
答案 0 :(得分:0)
调用node->children->erase(i)
后,i
是无效的迭代器。之后对它的任何操作都是未定义行为的原因。你需要使用的是:
i = node->children.erase(i);
并删除用于递增和递减迭代器的代码。
for(i = node->children.begin(); i != node->children.end(); /* ++i Don't need this*/ )
{
destroySubtree((*i)); //segfaults here, only when debugging
list<TreeNode>::iterator j;
for(j = nodes.begin(); j != nodes.end(); j++)
{
if((j)->nId == (*i)->nId)
{
nodes.erase(j);
break;
}
}
i = node->children.erase(i);
// i--; Don't need this.
}