13

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

错误是

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

2 回答 2

27

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

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

还有duma(检测意外内存访问)库。它也可以在其他平台上工作,速度更快,但它使用更多的内存。

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

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

于 2013-10-23T06:16:25.073 回答
0

警告:非常具体的用例

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

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

事实证明-QObject派生对象不应该被复制,但我没想到我的QObject- 派生类上的复制构造函数会导致这种错误。

于 2016-11-24T13:43:19.880 回答