free()怎么不需要长度参数?

时间:2012-08-10 00:46:26

标签: c memory-management

  

可能重复:
  C programming : How does free know how much to free?

一个随机的想法让我觉得free(myPtr)怎么不需要长度参数?它如何知道要释放多少内存?

我只能猜测它会跟踪它为每个特定起始地址分配的内存量。

2 个答案:

答案 0 :(得分:7)

这是因为malloc保存了有关已分配块的长度的信息,通常是在返回到程序的地址之前的位置。实现为size_t分配额外存储,将大小放在那里,添加sizeof(size_t)并将其作为malloc-ed指针返回给您并不罕见。因此,该标准不要求这种实现,因此可以采用替代实施方式,例如,基于哈希表。

答案 1 :(得分:3)

当C分配内存时,它会记录与它给出的指针相关的长度。 (通常位于内存块之前的区域。但这是一个实现细节。)它保留了一些表或它分发的内存块列表,当你释放内存时,C查找该块的长度关于指针的值。

这就是为什么传递给free的指针必须与从malloc返回的指针完全相同的部分原因。如果不是,C会感到困惑,无法找到正确的内存块(或其长度),并且可能最终“释放”一些它从未打算触及的内存。 (如果它这样做,你可能会得到一个称为“堆损坏”的条件,这真的很糟糕 - 从那时起,C可能会做各种古怪的事情,比如试图在现有的中间分配一些内存阻止和破坏那里的任何东西。)