在C编程中,你可以将任何类型的指针作为参数传递给free,它如何知道要释放的已分配内存的大小?每当我传递一个指向某个函数的指针时,我也必须传递大小(例如,一个由10个元素组成的数组需要接收10作为参数才能知道数组的大小),但我不必将大小传递给free函数。为什么不呢?我可以在我自己的函数中使用同样的技术,这样我就不需要在数组长度的额外变量之间来回奔波了吗?
发布于 2009-10-05 07:49:18
当您调用malloc()时,您指定要分配的内存量。实际使用的内存量略大于此,并且包括记录(至少)块有多大的额外信息。您不能(可靠地)访问其他信息--也不应该:-)。
当您调用free()时,它只是查看额外的信息,以确定块有多大。
发布于 2009-10-05 07:53:40
从comp.lang.c常见问题列表:How does free know how many bytes to free?
malloc/free实现会在分配时记住每个块的大小,因此在释放时没有必要提醒它大小。(通常,大小存储在分配的块附近,这就是为什么如果分配的块的边界被稍微越界,事情通常会严重破坏)
发布于 2009-12-27 00:56:34
这个答案来自How does free() know how much memory to deallocate?,在那里,我被一个明显重复的问题断然阻止了回答。那么这个答案应该与这个副本相关:
对于malloc,堆分配器存储原始返回指针到稍后free内存所需的相关详细信息的映射。这通常涉及以与正在使用的分配器相关的任何形式来存储存储器区域的大小,例如原始大小,或者用于跟踪分配的二叉树中的节点,或者正在使用的存储器“单位”的计数。
如果您“重命名”指针或以任何方式复制它,free都不会失败。但是,它不会被引用计数,并且只有第一个free是正确的。额外的free是“双重释放”错误。
尝试使用不同于以前malloc返回的值的值释放任何指针,但尚未释放是错误的。无法部分释放从malloc返回的内存区域。
https://stackoverflow.com/questions/1518711
复制相似问题