C ++调试segfault,无需调试即可正常运行

时间:2014-12-06 01:01:21

标签: c++ list debugging

我正在使用树状结构。

树中的所有节点都保存在列表中,每个节点的子节点都保存在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如果有帮助吗?

1 个答案:

答案 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.
}