不要天真的想程式中用了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 }
終端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其中的冰山一角。具體那些小一些的塊是如何處理的,大家就自
己研究吧。