c++ - glibc 检测 smallbin 链表损坏

标签 c++ memory-management memory-leaks

我试图在一个大循环中重复运行一个函数,但在 2 或 3 次迭代后出现错误,但如果我从它给出错误的点开始,它工作正常但在 3 4 次迭代后再次停止。可能是内存问题。由于函数非常大,我不确定到底哪里有内存泄漏。无论如何我可以在每次迭代后释放变量或者可以解决这个问题的东西。或者因为它是一个链表内存问题释放所有链表什么的?有什么解决办法吗?如果我运行该函数一次就不会发生问题,所以我认为这是因为我在循环中重复调用该函数。有什么办法可以解决这个问题吗?

错误是

**glibc detected:.....malloc():smallbin double linked list corrupted: 0x000000000 1d404c0 ***

最佳答案

库告诉您内存元数据已损坏。仅仅内存泄漏不会发生这种情况,您必须写入无效指针。您要么写入索引越界,要么在释放指针后写入指针。

调试此类问题的最简单方法是使用 valgrind .它只适用于 Linux,但你似乎已经在使用它了。它相当慢,因为它单步执行程序并检查每个内存访问指令,但它可以非常可靠地捕获无效内存访问以及未初始化变量和内存泄漏的使用。

还有duma (detect unintended memory access)图书馆。它也可以在其他平台上工作并且速度更快,但它使用更多的内存。

还有gcc自己的mudflap可以通过特定的编译器选项激活。那个应该适用于大多数 gcc 目标,但我不确定 C++ 支持有多完整。

更新 (11/2018):挡泥板大部分被 Google Sanitizers 取代, 这是 Clang 的一部分.

关于c++ - glibc 检测 smallbin 链表损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19534051/

相关文章:

c++ - ifstream 在读取文件 3 次后中断

c++ - 如何让声音停止在 OpenAL 中播放

c++ - 尝试通过多个函数移动数组并遇到一个我不知道如何修复的错误

c++ - 如何在多态性中为指定类型分配内存?

memory-leaks - 如何分析 Java 8 压缩类空间中的内存泄漏?

javascript - 在 Javascript 中存储 JSON 响应的大小

memory-management - C/Pascal 的堆管理器,可自动用零字节填充已释放的内存

c++ - 从某个较大的虚拟地址空间(例如 20GB 以上)分配内存

c - 故意使内存泄漏的 C 应用程序崩溃

Django South migration 泄漏内存