In C programming, you can pass any kind of pointer you like as an argument to free, how does it know the size of the allocated memory to free? Whenever I pass a pointer to some function, I have to also pass the size (ie an array of 10 elements needs to receive 10 as a parameter to know the size of the array), but I do not have to pass the size to the free function. Why not, and can I use this same technique in my own functions to save me from needing to cart around the extra variable of the array's length?


当前回答

要回答第二个问题,是的,您可以(某种程度上)使用与malloc()相同的技术 通过简单地将每个数组中的第一个单元格分配给数组的大小。 这样就可以在不发送额外size参数的情况下发送数组。

其他回答

当您调用malloc时,堆管理器将属于已分配块的内存量存储在某处。

我从来没有实现一个自己,但我猜在前面的内存分配块可能包含元信息。

来自comp.lang.c常见问题列表:free如何知道释放多少字节?

malloc/free实现在分配每个块时记住它的大小,因此在释放时不需要提醒它大小。(通常,大小存储在已分配块的相邻位置,这就是为什么如果已分配块的边界稍有超出,情况通常会很糟糕)

与此相关的是,GLib库具有不保存隐式大小的内存分配函数——然后您只需将size参数传递给free即可。这可以减少部分开销。

当我们调用malloc时,它只是从它的需求中消耗更多的字节。这更多的字节消耗包含信息,如校验和,大小和其他额外的信息。 当我们调用free时,它会直接到附加信息那里它会找到地址,也会找到有多少块是空闲的。

free()如何知道释放多少内存?我突然被一个明显重复的问题阻止了回答。这个答案应该与这个副本相关:


对于malloc,堆分配器将原始返回指针的映射存储到稍后释放内存所需的相关细节。这通常涉及以与正在使用的分配器相关的任何形式存储内存区域的大小,例如原始大小,或用于跟踪分配的二叉树中的节点,或正在使用的内存“单元”的计数。

Free不会失败,如果你“重命名”指针,或以任何方式复制它。然而,它是不计算参考,只有第一个自由将是正确的。额外的自由是“双重自由”错误。

试图释放与之前malloc返回值不同且尚未释放的任何指针将会出错。不可能部分释放从malloc返回的内存区域。