gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:29:29 25 4
gpt4 key购买 nike

我得到了一个调试短链接列表程序的练习,虽然我已经修复它以使其在有和没有调试器的情况下都能正常运行,但有一种情况我无法从什么时候开始思考我在调试。

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

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...

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

我正在使用 Code::Blocks 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;
}

关于c++ - 链表程序在代码块调试器下挂起,但在其他情况下正常执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36372116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com