【问题标题】:C Pointers malloc [duplicate]C指针malloc [重复]
【发布时间】:2011-06-25 23:24:27
【问题描述】:

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

嗨,

使用 malloc() 时,我们指定分配的大小,因此它知道要分配多少。然而,free() 怎么知道要释放多少字节呢?指针只包含内存块的起始地址,不包含内存块的长度。

感谢和问候, 塔齐姆。

【问题讨论】:

    标签: c pointers malloc free


    【解决方案1】:

    这个问题的答案取决于实现; malloc 库以某种方式跟踪长度,但 C 语言标准没有具体说明它是如何做到的。

    一个典型的做法是在malloc返回给调用者的“起始地址”之前存储一些头信息(包括长度)。

    【讨论】:

      【解决方案2】:

      Malloc 将分配指针的大小保存在某种数据结构中。当您调用 free 时,它​​会查找此数据结构中的条目并释放那么多内存。

      【讨论】:

        【解决方案3】:

        当你分配内存时,运行时库也会维护一些内部结构。它必须跟踪堆的哪些部分已被分配。该信息还告诉它在给定指向该内存的指针的情况下该内存块的大小。

        这取决于实现,但很有可能在指针返回之前存储此信息。

        【讨论】:

          【解决方案4】:

          它是特定于实现的。一些技巧:

          • 可能有多个指针。可以分配任意复杂的结构,您只需获得指向用户有效负载区域的指针。库知道给你的指针和指向结构原点的指针之间的固定偏移量。其他字段可能是大小和将空闲块连接在一起的链接。

          • 可能有单独的字典。这可以具有内存管理优势。使用分配的块进行簿记的一个问题是库本身最终会写入许多(如果不是大多数)分配的页面。这使它们保持肮脏(在 MMU 意义上)并且还可以防止它们在分叉后被共享。这对于 Web 服务器来说是一个大问题,并导致了 Web 语言系统(“Ruby Enterprise”)的专门实现,主要区别在于内存管理核心。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-14
            • 2017-05-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多