C Sysmalloc断言失败

我在运行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断言失败的问题

谢谢

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

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

编辑:谷歌搜索Assertion (old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) -直接引导我到这你没有做谷歌搜索吗?

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

例如,这是我的代码:

 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 tv(10); } 

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