2013-10-23 49 views
5

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

的错误是

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

回答

18

库告诉您存储元数据已损坏。这不会仅仅是内存泄漏,你必须写入无效指针。要么你写信给索引超出界限,要么你写了指针后释放。

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

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

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

+0

我在我的程序的不同部分得到相同的错误,所以我不能找出错误的地方,我会尝试使用valgrind.Thanks。 – user1583647

+0

@ user1583647:损坏通常是伪随机的,标准库只在实际发生后才会检测到它。但是当无效访问发生时,valgrind可以捕获。 –

+0

除了程序的标准库之外,还有什么方法可以获得程序的内存泄漏或内存问题吗? – user1583647

0

警告:非常具体使用情况

我,我用指针从QObject是有一个拷贝构造函数派生的对象使用Qt编写的应用程序中有这个问题。我莫名其妙地忽略编译过程中以下警告:

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

事实证明,QObject派生对象are not supposed to be copied,但我没想到我的QObject派生类的拷贝构造函数造成这种错误。

相关问题