可能重复:
C 编程:free 如何知道要释放多少?
我突然想到为什么free(myPtr)
不需要长度参数?它如何知道要释放多少内存?
我只能猜测它会跟踪它为每个特定的起始地址分配了多少内存。
这是因为 malloc 保存有关已分配块长度的信息,通常位于返回给程序的地址之前的位置。实现为 size_t 分配额外的存储空间,将大小放在那里,添加 sizeof(size_t),并将其作为 malloc 指针返回给您并不罕见。然而,该标准不要求这种实现,因此替代实现是可能的,例如基于散列表。
当 C 分配内存时,它会记录与它给你的指针相关的长度。(通常在内存块之前的区域。但这是一个实现细节。)它保留某种形式的内存块表或列表,当您释放该内存时,C 根据该块的长度查找关于指针的值。
这就是为什么您传递给的指针必须free
与您从malloc
. 如果不是这样,C 会感到困惑并且找不到正确的内存块(或其长度),并且很可能最终“释放”一些它从未打算触及的内存。(如果这样做,您最终可能会遇到一种称为“堆损坏”的情况,这真的很糟糕——从那时起,C 可能会做各种古怪的事情,比如试图在现有的中间分配一些内存阻止和破坏那里的任何东西。)