不要天真的想程序中用了free之后,你的程序就会把内存还给了操作系统。从事C编程的人应该要知道,我们所用
的malloc和free是由glibc提供的。glibc是一个具有系统级感觉的用户级程序,负责管理内存堆区。所以到底把free的
内存还给还是没还给操作系统,大家还是看malloc和free的源码比较好。
现在就交大家测试一下malloc和free的方法。
01 #include <stdlib.h>
02 #include <stdio.h>
03
04 char*ch[1000];
05
06 int main(intargc,char*argv[])
07 {
08
09 inti,j;
10
11 int size=atoi(argv[1]);
12
13 for(i=0; i<1000; ++i)
14 ch[i]= (char*)malloc(size); //申请内存
15
16 for(i=0; i<1000; ++i) //换入内存,如不进行操作,glibc并不会真正的向系统申请内存
17 for(j=0; j<size; ++j) //这样做是为了去掉glibc对内存管理的优化操作
18 ch[i][j]='a';
19
20 getchar(); //IO中断,为了给查看进程内存提供时间
21
22 for(i=0; i<1000; ++i) //释放内存
23 free(ch[i]);
24
25 while(1); //为了给查看进程内存提供时间
26
27 return0;
28
29 }
02 #include <stdio.h>
03
04 char*ch[1000];
05
06 int main(intargc,char*argv[])
07 {
08
09 inti,j;
10
11 int size=atoi(argv[1]);
12
13 for(i=0; i<1000; ++i)
14 ch[i]= (char*)malloc(size); //申请内存
15
16 for(i=0; i<1000; ++i) //换入内存,如不进行操作,glibc并不会真正的向系统申请内存
17 for(j=0; j<size; ++j) //这样做是为了去掉glibc对内存管理的优化操作
18 ch[i][j]='a';
19
20 getchar(); //IO中断,为了给查看进程内存提供时间
21
22 for(i=0; i<1000; ++i) //释放内存
23 free(ch[i]);
24
25 while(1); //为了给查看进程内存提供时间
26
27 return0;
28
29 }
终端1:
gcc test.c
./a.out 32768
之后不要敲击任何键
终端2:
ps v -C a.out
我测试的时候,内存利用率大概为8%
之后,在终端1上敲击一下回车,程序会调用free释放内存。
在终端2上重新键入ps v -C a.out,会发现内存利用率并没有下降还是8%(看到了吧,free之后是什么样子,并没有
变)。
当我们把32768换成65536再试试,你就会发现不一样的情况。看样子glibc在释放的时候是做了阈值限制的,大于
64K的内存块才是被真正的释放。当然这只是glibc其中的冰山一角。具体那些小一些的块是如何处理的,大家就自
己研究吧。