C Sysmalloc断言失败

时间:2015-08-11 07:59:05

标签: c memory-management malloc assertion

我在运行C程序时收到以下sysmalloc错误。

malloc.c:3096: 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.

使用int数组时程序运行正常

int(*M)[cnt] = malloc(sizeof(int[cnt][cnt]));

但是对于签名的long int显示了上述错误。该计划没有其他变化。

signed long int(*M)[cnt] = malloc(sizeof(signed long int[cnt][cnt])); 

可能是什么原因?这在使用int数组时非常有效。因此,这里给出的内存管理不应该是一个问题 C Malloc assertion failure

由于

2 个答案:

答案 0 :(得分:1)

这个断言表达式看起来像是一个健全性检查,以查看分配内部数据结构是否仍然完整。

此内部数据通常放在分配的块之前和/或之后。如果出现问题,则表示在此malloc()之前执行的代码已写入超出先前已分配块的范围。

编辑:对Assertion (old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) -进行谷歌搜索直接导致我this。你没有进行谷歌搜索吗?

答案 1 :(得分:0)

我自己的经验,这可能有所帮助:这肯定是一个失败,因为一些动态分配的内存使用不正确(例如,超出绑定的分配)。棘手的是,失败可能不会发生在越界发生的行中。

例如,这是我的代码:

int func(const int n) {
    int *a = new int[n]; // * sizeof(int)
    for (int i = 0; i < n; ++i)
        a[i] = 1;

    // This line causes the sysmalloc assertion failure
    vector<int> tv(10);
}

现在,当为tv分配内存时发生故障,但实际问题是我在分配内存时忘记了* sizeof(int),因此在循环中,在非分配的内存地址中写入。