【问题标题】:Valgrind 8 bytes inside a block of 16 free'dValgrind 在 16 个块内释放 8 个字节
【发布时间】:2014-12-05 20:11:14
【问题描述】:

我正在为课堂上的实验室编写代码,这是使用循环链表进行 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)

感谢您的帮助

【问题讨论】:

  • delete n 然后n = n-&gt;next???
  • 然而,它完全可以在没有实现我的功能的作业版本中运行
  • 未定义的行为 - 它可以工作,也可以失败。
  • @FutureShocked 这就是带有错误的代码的问题——它没有达到您的预期。修复错误,谜团就会消失。
  • @FutureShocked 这很简单——在delete 之后不要访问对象。你的代码做到了,这就是问题所在。这可能会导致不可预测的行为。

标签: c++ memory-leaks linked-list memcheck


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多