【发布时间】:2011-06-25 23:24:27
【问题描述】:
嗨,
使用 malloc() 时,我们指定分配的大小,因此它知道要分配多少。然而,free() 怎么知道要释放多少字节呢?指针只包含内存块的起始地址,不包含内存块的长度。
感谢和问候, 塔齐姆。
【问题讨论】:
嗨,
使用 malloc() 时,我们指定分配的大小,因此它知道要分配多少。然而,free() 怎么知道要释放多少字节呢?指针只包含内存块的起始地址,不包含内存块的长度。
感谢和问候, 塔齐姆。
【问题讨论】:
这个问题的答案取决于实现; malloc 库以某种方式跟踪长度,但 C 语言标准没有具体说明它是如何做到的。
一个典型的做法是在malloc返回给调用者的“起始地址”之前存储一些头信息(包括长度)。
【讨论】:
Malloc 将分配指针的大小保存在某种数据结构中。当您调用 free 时,它会查找此数据结构中的条目并释放那么多内存。
【讨论】:
当你分配内存时,运行时库也会维护一些内部结构。它必须跟踪堆的哪些部分已被分配。该信息还告诉它在给定指向该内存的指针的情况下该内存块的大小。
这取决于实现,但很有可能在指针返回之前存储此信息。
【讨论】:
它是特定于实现的。一些技巧:
可能有多个指针。可以分配任意复杂的结构,您只需获得指向用户有效负载区域的指针。库知道给你的指针和指向结构原点的指针之间的固定偏移量。其他字段可能是大小和将空闲块连接在一起的链接。
可能有单独的字典。这可以具有内存管理优势。使用分配的块进行簿记的一个问题是库本身最终会写入许多(如果不是大多数)分配的页面。这使它们保持肮脏(在 MMU 意义上)并且还可以防止它们在分叉后被共享。这对于 Web 服务器来说是一个大问题,并导致了 Web 语言系统(“Ruby Enterprise”)的专门实现,主要区别在于内存管理核心。
【讨论】: