c++ - Valgrind 8 个字节,包含 16 个免费 block

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

我在一个类似的问题中看到问题可能是我正在尝试访问已经释放的内存。 IE。如果 n 不再存在,n = n->next 怎么办?我尝试使用 current 和 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 会导致 head 更新吗?如果不是,那么当您到达链接列表的末尾时,您将再次达到未定义的行为(这可能是由于 deleteing nullptrdelete 垃圾指针(取决于链表末尾的 n->next 指向什么)。

关于c++ - Valgrind 8 个字节,包含 16 个免费 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27323913/

相关文章:

c++ - cpp中的类实例化

c++ - 使用字符串成员函数格式化 SSN

c - Ptheard 会杀死线程函数中分配的空闲动态内存吗?

ruby-on-rails - Rails 内存泄漏的主要因素

C 程序 - 链表问题

c++ - ftruncate() 是异步的吗?

c++ - 简单的C++程序帮助编译

memory-leaks - MPI_REDUCE 导致内存泄漏

java - 如何在现有键处将唯一值添加到 HashMap

java - 链接列表 - 删除索引处的元素