这个问题在接受我的采访时被问到了。
假设char * p = malloc(n)分配多于n,分配N个字节的内存,free(p)用于释放分配给p的内存。
堆管理器可以执行这样的错误分配吗? 现在发生了什么,将释放n个字节或释放N个字节?
是否有任何方法可以找到释放多少内存?
修改
是否有任何方法可以找到释放多少内存?
总比没有好,
mallinfo()可以根据“Fred Larson”指出的一些亮点。
答案 0 :(得分:8)
是的,几乎每次你malloc()
都会发生这种情况。 malloc
块头包含有关块大小的信息,并且在调用free()
时,它会将该量返回给堆。这不是错误的,它是预期的操作。
free()
看起来像这样:
void free(void *ptr)
{
size_t *size = (size_t *)ptr - 1;
return_to_heap(ptr, *size);
}
其中return_to_heap()
用于表示将指定的内存块返回堆以供将来使用的实际工作的函数。
答案 1 :(得分:4)
是的,允许堆管理器返回超过 n 字节的块。使用free
释放返回的指针是完全安全的(并且必需!),free
将释放所有指针。
许多堆实现通过将元数据块插入堆中来跟踪其分配。 free
将查找该元数据以确定要释放多少内存。这是特定于实现的,因此无法知道malloc
给了你多少,通常,你不应该关心。
答案 2 :(得分:1)
通常,堆管理器将释放它分配的任何内容。它将此信息存储在某处,并在调用free()
时进行查找。
如果堆分配器分配的内存多于请求的内存,则它不会“出错”。堆管理器通常使用固定块大小,并在满足请求时舍入到下一个适当的块大小。堆管理器的工作是尽可能高效,并且通常会因为一些小的低效率而产生很高的效率。
答案 3 :(得分:1)
这是malloc的默认行为。它将返回NULL
或指向内存部分的指针,至少与您要求的内容一样长。所以是免费的必须能够处理比所要求的更长的内存。
确定实际释放或分配的内存量是一个特定于平台的问题。
答案 4 :(得分:1)
其他答案已经解释了如何处理块大小。要了解释放了多少内存,我能想到的唯一解决方案是在免费之前和之后调用mallinfo()
。