我正在为课堂实验编写代码,这是一个使用循环链表进行OOD设计练习的过程。这意味着一些关键函数对我不可用。然而,我大部分困惑的原因是尽管我的驱动程序模仿了教授编写的驱动程序,但我仍然在标题中收到mchk错误。以下是它引用的代码:
{
int nNodesFreed{0};
node* n{head};
for(; n!= head || ! nNodesFreed; n = n->next) {
delete n;
nNodesFreed++;
}
cout << "# nodes freed: " << nNodesFreed << endl;
}
我在一个类似的问题中看到,问题可能是我试图访问已经被释放的内存。例如,如果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)
感谢任何帮助。
delete
一个对象之后不要再访问它。你的代码就是这样做的,这就是问题所在。这可能会导致不可预测的行为。 - David Schwartz