我正在使用以下方式分配内存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 个指针?
我正在使用以下方式分配内存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 个指针?
malloc
总是分配比你要求的多一点,这是内部会计所必需的,由碎片化等引起的。
至少 - 每个分配块的大小需要存储在某个地方,通常还存储一些指针(例如指向下一个分配/空闲块),并且在某些情况下(例如调试构建)还存储额外的调试信息。大多数实现在未分配的空间中存储尽可能多的信息,因此每个分配的块中只会存储几个字节(例如大小)。
至于碎片,许多实现具有最小分配大小或四舍五入请求的大小以保持某种对齐。
free (array) 应该在循环内以释放所有指针,而不是仅释放最后一个指针。
关于释放所有 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]);
}
}
当你调用 malloc() 时,实际使用的内存量比请求的要多一点。这个额外的内容包括记录块有多大、下一个空闲块在哪里可用等信息。
这个额外的信息是 free() 函数知道要释放多少的原因。