free()如何知道malloc()或calloc()先前分配了多少内存空闲?我的意思是,这两个函数都接收大小作为参数,而free只需要指向已分配内存的指针。然后free()如何知道要释放多少?
答案 0 :(得分:1)
你不需要知道。
它可以使用任何机制,由实现标准库的人来决定。
一种典型的方法是在指针返回应用程序之前的某处存储块信息,但您也可以使用完全独立的数据结构来跟踪分配,也许某种树将指针用作键寻找描述该分配的信息。
如果您真的想知道,要学习,您当然可以阅读开源C标准库实现的源代码,其中至少有一对。
答案 1 :(得分:0)
C标准要求将malloc
返回的相同地址传递给free
以释放动态内存,因此很明显malloc
维护某种表或映射每个分配的地址(请注意,确切的详细信息是未经验证的),它会根据地址存储已分配内存的大小,因此它确切地知道为每个返回给其调用者的地址分配了多少内存。在free
调用中,它将查找此映射以了解要释放多少内存。
答案 2 :(得分:0)
通常,您在免费商店中拥有类似已分配资源的链接列表。内存管理器将搜索该列表中的内存块,将其从已分配资源列表中删除并将其插回到空闲资源,以便分配函数再次调用它。如何完成这取决于编译器的实现。