我接受了一个调试短链接列表程序的练习,虽然我已经修复它以使其在有和没有调试器的情况下都能正常运行,但有一种情况我无法解决这个问题。我正在调试。
以下代码片段遍历并显示链接列表的内容。
while ( p_itr != NULL )
{
cout << p_itr->val << endl;
p_itr = p_itr->p_next;
delete p_itr;
}
现在,这是奇怪的事情:当我删除p_itr(指向列表头部的指针)时,我不应该失去与列表其余部分的链接或在后续迭代期间取消引用无效内存吗?
当我正常运行程序时,它会完美地显示所有链接列表元素并正常返回(不挂起) - 当我使用调试器时,它会陷入无限循环,打印出无关值的模式。
例如,当我将元素2,2和2添加到列表中时:
输出: 2 2 2
2 14166872 14166808 14161464 14155968 14167352 14166872 14166808 ...
为什么普通程序执行成功?但我的主要问题是,为什么调试器会陷入这些值的无限循环而普通程序却没有?
我正在使用Code :: Blocks 16.01。
答案 0 :(得分:1)
此代码段
while ( p_itr != NULL )
{
cout << p_itr->val << endl;
p_itr = p_itr->p_next;
delete p_itr;
}
具有未定义的行为,因为除了循环的第一次迭代之外,还可以访问已经删除的对象。
目前尚不清楚为什么在列表输出时删除节点。然而,循环应至少看起来像
while ( p_itr != NULL )
{
cout << p_itr->val << endl;
auto tmp = p_itr;
p_itr = p_itr->p_next;
delete tmp;
}