我在运行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
由于
答案 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)
,因此在循环中,在非分配的内存地址中写入。