代码之家  ›  专栏  ›  技术社区  ›  Rozuur

当试图释放堆管理器分配的内存时,会发生什么情况?堆管理器分配的内存比要求的多?

  •  8
  • Rozuur  · 技术社区  · 16 年前

    这个问题是在一次采访中问我的。

    假设char*p=malloc(n)分配的内存大于n,假设分配了n个字节的内存,并使用free(p)来释放分配给p的内存。

    堆管理器可以执行这种错误的分配吗? 现在会发生什么,n个字节被释放还是n个字节被释放?

    有什么方法可以找到释放了多少内存吗?

    编辑

    有什么方法可以找到释放了多少内存吗?

    总比什么都没有好,

    mallinfo()可以像“fred larson”所指出的那样发出一些光

    5 回复  |  直到 16 年前
        1
  •  8
  •   Carl Norum    16 年前

    是的,几乎每次都是这样 malloc() . 这个 malloc 块头包含有关块大小的信息,以及 free() 调用时,它会将该量返回到堆中。不是故障,是预期的操作。

    例如,一个简单的实现可能只将块的大小存储在返回指针前面的空间中。然后, 自由() 会像这样:

    void free(void *ptr)
    {
        size_t *size = (size_t *)ptr - 1;
    
        return_to_heap(ptr, *size);
    }
    

    在哪里? return_to_heap() 这里使用的是指一个函数,它执行将指定内存块返回堆以供将来使用的实际工作。

        2
  •  4
  •   Nick Meyer    16 年前

    是的,允许堆管理器返回大于 n 字节。它是完全安全的(而且是必需的!)使用 free 和 自由的 将全部取消分配。

    许多堆实现通过在堆中插入元数据块来跟踪它们的分配。 自由的 将查找该元数据以确定要释放多少内存。不过,这是特定于实现的,所以无法知道 malloc 给了你,一般来说,你不应该在意。

        3
  •  1
  •   Kristopher Johnson    16 年前

    通常堆管理器将释放它分配的任何内容。它将这些信息存储在某个地方,并在 free() 被称为。

    如果堆管理器分配的内存比请求的多,则它不是“错误的”。堆管理器通常使用固定的块大小,并且在满足请求时将舍入到下一个适当的块大小。堆管理器的工作是尽可能地高效,而高效通常是由一些小的低效导致的。

        4
  •  1
  •   JaredPar    16 年前

    这是malloc的默认行为。它会回来的 NULL 或者一个指向一段内存的指针,至少和你要求的一样长。因此,是的,free必须能够处理清除内存的时间比要求的时间长。

    找出实际空闲或分配了多少内存是一个特定于平台的问题。

        5
  •  1
  •   Fred Larson    16 年前

    其他答案很好地解释了块大小是如何处理的。要想知道释放了多少内存,我唯一能想到的方法是调用 mallinfo() 自由前后。