为什么free()函数不需要长度参数?

3

可能是重复问题:
C编程:free如何知道需要释放多少内存?

我突然想到一个问题,free(myPtr)为什么不需要长度参数呢?它是如何知道需要释放多少内存的呢?

我猜测它会追踪每个特定起始地址分配了多少内存。

2个回答

8
这是因为malloc会保存已分配块的长度信息,通常在返回给程序的地址之前的某个位置。实现时为了存储size_t,往往会额外分配空间,将大小存储在那里,并加上sizeof(size_t)后返回作为malloc指针。尽管标准未要求这种实现方式,但是也可以采用其他替代方案,例如基于哈希表的实现。

1
此外,这样做更容易,也可以避免开发人员跟踪块的长度所带来的问题。 - Rivasa
1
我也了解一种分配小对象的方法:你可以有几个“区域” - 每个区域只包含特定大小的对象,因此 free 可以通过检查释放的内存位于哪个区域来确定大小。 - Gir

3
当C语言分配内存时,它会记录与所给指针相关联的长度。(通常在内存块之前的某个区域中。但这是一些实现细节。)它会保留一种表格或列表,其中包含已分配的内存块,并且当你释放该内存时,C语言会根据指针的值查找该块的长度。
这就是为什么你传递给free的指针必须完全等于从malloc返回的指针的原因之一。如果不是,C语言就会感到困惑,并无法找到正确的内存块(或其长度),并可能最终“释放”一些本不应触及的内存。(如果发生这种情况,你可能会遇到称为“堆破坏”的情况,这是非常糟糕的——从那时起,C语言可能会做出各种古怪的事情,例如尝试在现有块的中间分配一些内存并损坏其中的任何内容。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接