【问题标题】:How comes free() doesn't need a length parameter? [duplicate]为什么 free() 不需要长度参数? [复制]
【发布时间】:2012-08-07 07:18:20
【问题描述】:

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

我突然想到free(myPtr) 怎么不需要长度参数?它如何知道要释放多少内存?

我只能猜测它会跟踪它为每个特定的起始地址分配了多少内存。

【问题讨论】:

    标签: c memory-management


    【解决方案1】:

    这是因为 malloc 保存了有关已分配块长度的信息,通常保存在返回给程序的地址之前的位置。实现为 size_t 分配额外的存储空间,将大小放在那里,添加 sizeof(size_t),并将其作为 malloc ed 指针返回给您并不罕见。但是,该标准不要求此实现,因此可以使用替代实现,例如基于哈希表。

    【讨论】:

    • 另外,它更容易并且防止开发人员跟踪块长度的问题。
    • 我还读到了一种分配小对象的方法:你可以有几个“区域”——每个区域只包含特定大小的对象,所以 free 可以通过检查哪个区域来确定大小已释放内存的位置。
    【解决方案2】:

    当 C 分配内存时,它会记录与它给你的指针相关的长度。 (通常在内存块之前的区域。但这是一个实现细节。)它保留某种形式的内存块表或列表,当您释放该内存时,C 根据该块的长度查找关于指针的值。

    这就是为什么传递给free 的指针必须与从malloc 返回的指针完全相同的部分原因。如果不是,C 会感到困惑并且找不到正确的内存块(或其长度),并且很可能最终“释放”一些它从未打算接触的内存。 (如果这样做,您最终可能会遇到一种称为“堆损坏”的情况,这真的很糟糕——从那时起,C 可能会做各种古怪的事情,比如试图在现有的中间分配一些内存阻止和破坏那里的任何东西。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      相关资源
      最近更新 更多