glibc检测到smallbin链表损坏

use*_*647 10 c++ memory-leaks memory-management

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

错误是

**glibc detected:.....malloc():smallbin double linked list corrupted: 0x000000000 1d404c0 ***
Run Code Online (Sandbox Code Playgroud)

Jan*_*dec 24

该库告诉您内存元数据已损坏.仅仅因为内存泄漏就不会发生这种情况,你必须写入无效指针.您要么写入索引超出范围,要么在释放后写入指针.

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

还有duma(检测非预期的内存访问)库.它也可以在其他平台上工作并且速度更快,但它会占用更多内存.

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

更新(11/2018):mudflap主要被Google Sanitizers取代,后者是Clang的一部分.

  • 我运行了valgrind,但它给了我很长的错误列表,其中大部分是来自程序中使用的标准库,所以除了使用的标准库之外,还有什么方法可以列出程序中的内存泄漏吗? (2认同)