链表程序挂在代码块调试器下,但在其他情况下正常执行
Linked List program hangs under codeblocks debugger but executes normally otherwise
我得到了一个调试短链表程序的练习,虽然我已经修复了它,使它在使用和不使用调试器的情况下都能正常运行,但在调试时,我无法理解其中的一个场景。
下面的代码片段遍历并显示链接列表的内容。
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;
}
相关文章:
- 如何在没有信号的情况下从C++执行QML插槽
- 防止SC_METHOD在没有事件/触发器的情况下执行
- C++项目编译强制使用 /clr 选项,尽管在没有公共语言运行时支持的情况下执行它
- 如何在不为其声明变量的情况下获取和使用常量值的地址?
- 如何在没有外部库的情况下使用C++03约束执行基于正则表达式的字符串操作
- 如何在派生类中不显式调用base::func()的情况下从基类执行虚拟函数
- C++:如何在不将命令传递给 shell 的情况下执行文件?
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 可以在没有MATLAB安装的情况下执行C 到MATLAB代码接口
- C++:如何在不执行的情况下将函数+参数作为参数传递
- 为什么C++没有简洁的语法允许在不定义计数器的情况下多次执行操作?
- 如何在没有对象的情况下执行插槽功能
- 有没有办法在不知道每个进程中每个数组的大小的情况下执行MPI_Gatherv?
- 派生类中的方法在引用的类中没有 *virtual* 关键字的情况下执行
- 如何在不冻结线程/应用程序的情况下减慢方法执行速度
- C++。可以在没有错误的情况下执行此操作:"未在此范围内声明"
- 在不使用单个 if 的情况下执行一些语句
- 如何使用循环检查等效性,然后在没有等效性的情况下执行一些代码?
- 是否可以在不重新打开重新打开 win32 窗口的情况下执行需要提升的任务
- 是否可以在不使用任何头文件的情况下在C++中执行I/O操作