1.为什么free是void*,那么它怎么知道要释放多少内存?
《UNIX环境高级编程》
《C语言编程常见问题解答》
《你必须知道的495个C语言问题》
《UNIX环境高级编程》
2.free源码
内存控制块结构定义
struct mem_control_block { int is_available; int size; };
可能会认为当程序调用 malloc 时这会引发问题 —— 它们如何知道这个结构?答案是它们不必知道;在返回指针之前,我们会将其移动到这个结构之后,把它隐藏起来。这使得返回的指针指向没有用于任何其他用途的内存。那样,从调用程序的角度来看,它们所得到的全部是空闲的、开放的内存。然后,当通过 free() 将该指针传递回来时,我们只需要倒退几个内存字节就可以再次找到这个结构。
在讨论分配内存之前,我们将先讨论释放,因为它更简单。为了释放内存,我们必须要做的惟一一件事情就是,获得我们给出的指针,回退 sizeof(struct mem_control_block) 个字节,并将其标记为可用的。
解除分配函数void free(void *firstbyte) { struct mem_control_block *mcb; /* Backup from the given pointer to find the * mem_control_block */ mcb = firstbyte - sizeof(struct mem_control_block); /* Mark the block as being available */ mcb->is_available = 1; /* That''s It! We''re done. */ return; }
看一下函数第二句,这句非常重要和关键。其实这句就是把指向可用空间的指针倒回去,让它指向管理信息的那块空间,因为这里是在值上减去了一个结构体的大小!
3.查找free到底上哪儿查找需要释放的内存大小
都是指针前边的4个字节
#include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { void *p1,*p2,*p3,*p4,*p5,*p6; p1=malloc(10); p2=malloc(38); p3=malloc(100); p4=malloc(200); p5=malloc(106); p6=malloc(300); return 0; }
------------------------------------------
更多内容:
malloc()和free()的原理
C语言的malloc()和free()函数原理【整理】
使用_msize疏忽导致的bug
内存管理内幕
关于free如何知道要释放内存空间的长度问题(X86篇) [vs答案]