Valgrind 16 块内的 8 个字节被释放

Fut*_*ked 4 c++ memory-leaks linked-list memcheck

我正在为课堂上的实验编写代码,这是使用循环链表进行 OOD 设计的练习。这仅意味着我无法访问所使用的一些关键功能。然而,我最困惑的是,虽然我的驱动程序模仿了教授写的驱动程序,但我仍然在标题中收到 mchk 错误。这是它引用的代码

{
int nNodesFreed{0};
node* n{head};

for(; n!= head || ! nNodesFreed; n = n->next) {
    delete n;
    nNodesFreed++;
    }
cout << "# nodes freed: " << nNodesFreed << endl;
}
Run Code Online (Sandbox Code Playgroud)

我在类似的问题中看到问题可能是我正在尝试访问已释放的内存。即,如果 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)
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

ine*_*ght 5

n您正在删除后访问。这会导致未定义的行为。

此外,您没有检查是否n->next有效:您head在第一次迭代中删除了。删除会n导致head更新吗?如果没有,那么当您到达链表末尾时,您将再次delete遇到未定义的行为(这可能是由于ing anullptrdeleteing 垃圾指针引起的(取决于n->next链表末尾指向的内容)。