glibc检测到smallbin链表损坏

时间:2013-10-23 06:10:37

标签: c++ memory-management memory-leaks

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

错误是

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

2 个答案:

答案 0 :(得分:22)

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

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

还有duma (detect unintended memory access)库。它也可以在其他平台上运行并且速度更快,但它会占用更多内存。

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

更新(11/2018):mudflap主要由Google Sanitizers取代,Clang属于{{3}}。

答案 1 :(得分:0)

警告:非常具体的用例

我在使用Qt编写的应用程序中遇到此问题,其中我使用指向从QObject派生的具有复制构造函数的对象的指针。我在编译过程中忽略了以下警告:

warning: base class ‘class QObject’ should be explicitly initialized in the copy constructor [-Wextra]

事实证明QObject - 派生对象are not supposed to be copied,但我没想到我的QObject派生类上的复制构造函数会导致这种错误。