神秘的malloc:sysmalloc:断言失败错误

6

我遇到了一个神秘的错误,但是不知道为什么会出现。这段代码在多次运行后才会失败,并且总是在同一点失败。

以下是我的代码:

    assert(size > 0);
    int* sorted = malloc(size * sizeof(int));

当我运行它时,出现以下错误:

    malloc.c:2369: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.

我尝试打印大小,结果是1。这段代码已经多次运行,包括1这个值,但仍然无法正常工作。请问有人知道我做错了什么吗?谢谢。

可能是为什么会出现C malloc断言失败?的重复问题。 - Ramchandra Apte
2
@ouah 我认为那行代码是malloc函数本身的一部分,而不是帖子作者的代码的一部分;他可能没有那个库的源代码。 - mah
没错,我没有注意到它是 malloc:2369,我以为它在他的源代码中。 - ouah
1个回答

6

通常当您的代码在先前某个时刻释放了无效地址,或者超出了分配的内存块的末尾时,就会发生这种情况。请使用valgrind或其他内存分析器运行您的代码,查看发生此情况的位置。


我尝试在每次使用 free 时进行注释。但我仍然收到错误信息。 - Ian
@Ian 然后查找您分配内存的位置,并查看是否始终提供了正确的 sizeof,以及该内存中的索引是否正确。这是最令人讨厌的错误类型,如果没有内存分析器,很难找到它们。 - Sergey Kalinichenko
1
我尝试通过valgrind运行代码并发现了一些错误。我会尝试修复它们,看看是否能够消除这个错误。谢谢! - Ian
1
就是这样!我读取了超出内存范围的内容,导致后来写入了超出内存范围的内容。 - Ian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接