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