- 論壇徽章:
- 1
|
本帖最后由 daxiguagg 于 2014-04-21 12:17 編輯
- malloc/free申請(qǐng)釋放問題???
- 下面是模擬一個(gè)程序的執(zhí)行情況。
- int main(int argc, char** argv) {
- void *buf[2000];
- int i=0,fds=2000;
- for (i=0;i<fds;i++) //循環(huán)申請(qǐng)內(nèi)存2000次,大概125MB
- {
- buf[i]=malloc(65536);//malloc函數(shù)分配內(nèi)存,請(qǐng)求內(nèi)存小于128K,malloc函數(shù)會(huì)調(diào)用brk系統(tǒng)調(diào)用,將_edata指針往高地址推
- memset(buf[i],0,65536);//第一次訪問已分配的虛擬地址空間的時(shí)候,發(fā)生缺頁中斷,系統(tǒng)負(fù)責(zé)分配物理內(nèi)存,然后建立虛擬內(nèi)存和物理內(nèi)存之間的映射關(guān)系。
- }
- sleep(60); //模擬等待處理一些工作。
- for (i=0;i<1999;i++)
- {
- free(buf[i]);//循環(huán)釋放,按理說free(buf[0]);到free(buf[1998]);已經(jīng)釋放了大量內(nèi)存,但程序依然占用125MB。是因?yàn)閎rk分配的內(nèi)存需要等到高地址內(nèi)存釋放以后才能釋放,也就是說,free(buf[1999])沒有釋放的話,之前的所有釋放都沒有釋放。最終導(dǎo)致程序一直占用125M多內(nèi)存一直得不到釋放。
- printf("%d\n",i);
- }
- sleep(10000);
- return (EXIT_SUCCESS);
- }
- 怎樣能在這種環(huán)境情況下及時(shí)的釋放內(nèi)存呢?
復(fù)制代碼 |
|