for循环中的动态内存分配

时间:2013-07-29 06:28:44

标签: c malloc dynamic-memory-allocation

我正在使用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 个答案:

答案 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()函数知道要释放多少的原因。