C++调试段错误,无需调试即可正常运行

C++ debugging segfault, runs fine without debugging

本文关键字:调试 正常运行 段错误 错误 C++      更新时间:2023-10-16

我正在使用树形结构。

树中的所有节点都保存在

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

调用 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.
}