1

我正在使用以下方式分配内存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 个指针?

4

4 回答 4

4

malloc总是分配比你要求的多一点,这是内部会计所必需的,由碎片化等引起的。

至少 - 每个分配块的大小需要存储在某个地方,通常还存储一些指针(例如指向下一个分配/空闲块),并且在某些情况下(例如调试构建)还存储额外的调试信息。大多数实现在未分配的空间中存储尽可能多的信息,因此每个分配的块中只会存储几个字节(例如大小)。

至于碎片,许多实现具有最小分配大小或四舍五入请求的大小以保持某种对齐。

于 2013-07-29T06:31:15.933 回答
1

free (array) 应该在循环内以释放所有指针,而不是仅释放最后一个指针。

于 2013-07-29T06:59:46.087 回答
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]);
   }
}
于 2013-07-29T06:53:58.653 回答
0

当你调用 malloc() 时,实际使用的内存量比请求的要多一点。这个额外的内容包括记录块有多大、下一个空闲块在哪里可用等信息。

这个额外的信息是 free() 函数知道要释放多少的原因。

于 2013-07-29T06:38:05.633 回答