我正在使用malloc
分配内存:
main()
{
int *array;
int i;
for(i = 0; i<40; i++)
{
array = malloc(100 * sizeof(int));
}
free(array);
}
这应该分配15.625KB
,但如果我在valgrind
中运行同样的内容,则峰值内存为15.92KB
。
怎么来的?
如何释放所有40个指针?
答案 0 :(得分:4)
malloc
总是分配比你要求的更多,内部会计所必需的,由碎片等引起的。
至少 - 每个已分配块的大小需要存储在某处,通常还会存储一些指针(例如,下一个已分配/空闲块),在某些情况下(例如调试版本),其他调试信息也是存储。大多数实现在未分配的空间中存储尽可能多的信息,因此每个分配的块中只存储几个字节(例如大小)。
对于碎片,许多实现具有最小的分配大小或舍入所请求的大小以保持某种对齐。
答案 1 :(得分:1)
关于释放所有40个指针,例如你可以有一个指针数组,它们包含从malloc返回的指针,并在函数结束时检查它。
有些事情:
main()
{
int *arrays[40];
int i;
for(i = 0; i<40; i++)
{
arrays[i]=malloc(100 * sizeof(int));
}
for(i = 0; i<40; i++)
{
free(arrays[i]);
}
}
答案 2 :(得分:1)
free(array)应该在循环内部释放所有指针而不是最后一个指针。
答案 3 :(得分:0)
当你调用malloc()时,实际使用的内存量略多于所请求的数量。这个额外的内容包括记录块有多大的信息,下一个可用块的位置等等。
这个额外的信息是free()函数知道要释放多少的原因。