链表程序挂在代码块调试器下,但在其他情况下正常执行

Linked List program hangs under codeblocks debugger but executes normally otherwise

本文关键字:常执行 情况下 执行 其他 代码 程序 调试器 链表      更新时间:2023-10-16

我得到了一个调试短链表程序的练习,虽然我已经修复了它,使它在使用和不使用调试器的情况下都能正常运行,但在调试时,我无法理解其中的一个场景。

下面的代码片段遍历并显示链接列表的内容。

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

调试器输出(按住"下一行"键后):

214166872141668081416146414155968141673521416687214166808…

为什么正常程序执行成功?但我的主要问题是,为什么调试器会陷入具有这些值的无限循环,而普通程序却不会?

我正在使用代码::块16.01。

此代码片段

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;
}
相关文章: