free真的釋放記憶體了嗎?

來源:互聯網
上載者:User

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

己研究吧。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.