我正在为课堂上的实验编写代码,这是使用循环链表进行 OOD 设计的练习。这仅意味着我无法访问所使用的一些关键功能。然而,我最困惑的是,虽然我的驱动程序模仿了教授写的驱动程序,但我仍然在标题中收到 mchk 错误。这是它引用的代码
{
int nNodesFreed{0};
node* n{head};
for(; n!= head || ! nNodesFreed; n = n->next) {
delete n;
nNodesFreed++;
}
cout << "# nodes freed: " << nNodesFreed << endl;
}
我在类似的问题中看到问题可能是我正在尝试访问已释放的内存。 IE。如果 n 不再存在,怎么可能 n = n->next 呢?我尝试使用当前指针和下一个指针切换到 while 循环,但这使问题变得更糟。该代码在我教授的作业版本中完美运行,其中我尚未实现我需要的功能。
我得到的确切错误是:
Invalid read of size 8
at 0x400D8A: main (lab04.cpp:28) // this references the for loop
Address 0x5a02048 is 8 bytes inside a block of size 16 free'd
at 0x4C28FAC: operator delete(void*)
by 0x400D81: main (lab04.cpp:29)
谢谢你的帮助
您正在访问n
删除后。这会导致未定义的行为。
此外,您没有检查n->next
有效:您删除了head
在第一次迭代中。是否删除n
cause head
要被更新?如果没有,那么你将达到未定义的行为again当您到达链接列表的末尾时(这可能是由以下原因引起的)delete
ing a nullptr
要不然delete
ing 一个垃圾指针(取决于什么n->next
链表末尾指向)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)