C++调试段错误,无需调试即可正常运行
C++ debugging segfault, runs fine without 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 如果有帮助?
调用 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.
}
相关文章:
- 如何让谷歌测试正常运行。测试总是失败。(它不会编译)
- C++ - 调试和运行时 Eclipse 行为不同
- 如何在visual studio代码的调试中运行c++脚本
- 多线程程序卡在优化模式下,但在 -O0 中正常运行
- 如何仅在调试中运行谷歌死亡测试?
- c++:if 语句无法正常运行,并继续执行无效输出
- 安卓游戏调试正常,但从Play商店下载时崩溃
- 如何制作硬编码堆栈,而不是硬编码并保持程序正常运行
- 函数在正常运行时不起作用,但在调试时起作用
- 否则,如果语句无法正常运行
- 如果输入变量的数据类型与以前不同,如何使我的循环仍然正常运行?
- 我的程序运行良好,可以复制对象,但是当我使用复制分配(=)时,它仍然可以正常运行.为什么不给错误
- 调试:运行时检查失败 #2 - 变量"LoggerThread"周围的堆栈已损坏
- 在 Ubuntu 16.04 的 usr/local/bin 中安装的 c++ 应用程序在从主目录执行时无法正常运行
- SImple 代码在 DevC++ 中正确运行,但不能在 Visual Studio Code 中正常运行
- 断言语句无法正常运行
- 程序.exe在Cygwin上运行,但在视觉工作室进行调试和运行时给出了例外
- 如何调试正常运行但在 ide 中返回分段错误的程序?
- C++:调试正常,运行发布得到错误的答案
- C++调试段错误,无需调试即可正常运行