尝试释放堆管理器分配的内存时会发生什么,分配的内容超过了要求?

我在接受采访时问了这个问题。

假设char * p = malloc(n)分配多于n,分配N个字节的内存,free(p)用于释放分配给p的内存。

堆管理器可以执行这样的错误分配吗? 现在发生了什么,将释放n个字节或释放N个字节?

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

编辑

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

有总比没有好,

mallinfo()可以像“Fred Larson”所指出的那样轻松一些

是的,几乎每次你使用malloc()时都会发生这种情况。 malloc块头包含有关块大小的信息,当调用free()时,它会将该量返回给堆。 这不是故障,它是预期的操作。

例如,一个简单的实现可能只是在返回指针之前的空间中存储块的大小。 然后, free()看起来像这样:

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

其中return_to_heap()用于表示执行将指定的内存块返回堆以供将来使用的实际工作的函数。

是的,允许堆管理器返回超过n个字节的块。 使用free释放返回的指针是完全安全的(并且是必需的!), free将释放所有它。

许多堆实现通过将元数据块插入堆中来跟踪其分配。 free将查找该元数据以确定要释放多少内存。 这是特定于实现的,所以没有办法知道malloc给你了多少,一般来说,你不应该关心。

通常,堆管理器将释放它分配的任何内容。 它将此信息存储在某处,并在调用free()时查找它。

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

这是malloc的默认行为。 它将返回NULL或指向内存段的指针,至少与您要求的一样长。 所以是免费的必须能够处理比所要求的更长的内存。

找出实际释放或分配的内存量是一个特定于平台的问题。

其他答案已经很好地解释了如何处理块大小。 为了找出释放了多少内存,我能想到的唯一解决方案是在mallinfo()之前和之后调用mallinfo()