Valgrind在16个空闲块中的8个字节

时间:2014-12-05 20:11:14

标签: 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;
}

我在一个类似的问题中看到问题可能是我试图访问已经被释放的内存。 I.E.如果n不再存在,n = n-&gt;接下来怎么办?我尝试使用当前和下一个指针切换到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)

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

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

此外,您并未检查n->next是否有效:您在第一次迭代中删除了head。删除n是否会导致head更新?如果没有,那么当您到达链接列表的末尾时,您将再次到达未定义的行为 (这可能是delete nullptr或其他原因造成的delete垃圾指针(取决于链接列表末尾的n->next指向)。