[問題] malloc & free

看板C_and_CPP作者 (旺來)時間14年前 (2011/04/18 13:55), 編輯推噓0(0018)
留言18則, 5人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 問題(Question): 想請教各位一個問題 我寫了一個很簡單的測試程式 內容就是malloc一塊記憶體(250MB)之後再free掉 但是這樣的動作在不同的平台上卻會有不同結果 平台1 : windows server 2003 32bit 可正常完全釋放所有記憶體 平台2 : windows server 2008 32bit 無法正常完全釋放所有記憶體(約留下22MB) 但是如果這時執行另一個測試程式將記憶體大量malloc吃到快光 此時程式就會慢慢釋放那些沒釋放的記憶體 平台3 : windows server 2008 64bit 可正常完全釋放所有記憶體 想請問這是甚麼原因造成的(是否windows本身的機制造成?) 以及是否有方法可以避免這樣的現象 謝謝 程式碼如下 : #include <stdlib.h> #include <stdio.h> #include <malloc.h> int main( void ) { char *string[1000][250]; int i, j; for(i = 0; i < 250; i++){ for(j = 0; j < 1000; j++){ string[j][i] = (char *)malloc( 1000 ); } } for(i = 0; i < 250; i++){ for(j = 0; j < 1000; j++){ free(string[j][i]); } } scanf("%d", &i); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.34.208.4

04/18 13:56, , 1F
你怎麼判斷「有沒有完全釋放」?
04/18 13:56, 1F

04/18 14:00, , 2F
從工作管理員來看 此程式記憶體(私人工作集)使用顯示22MB
04/18 14:00, 2F

04/18 14:01, , 3F
我認為這應該算是已經釋放 只是想問有辦法工作管理員也顯示
04/18 14:01, 3F

04/18 14:02, , 4F
其他平台上一樣的值嗎
04/18 14:02, 4F

04/18 14:03, , 5F
確定 malloc 傳回的位址都有丟給 free就好了, 函式庫
04/18 14:03, 5F

04/18 14:03, , 6F
沒立即還給系統而已
04/18 14:03, 6F

04/18 14:05, , 7F
跟 stdlib 及 os 的實作有關, 跟 os 要記憶體很貴的
04/18 14:05, 7F

04/18 14:06, , 8F
不馬上還剛好而已XD
04/18 14:06, 8F

04/18 14:07, , 9F
但是這例子中的2008 32BIT如果沒另一隻程式要求記憶體
04/18 14:07, 9F

04/18 14:08, , 10F
此程式會永遠顯示還有22MB 請問這樣是正常的嗎
04/18 14:08, 10F

04/18 14:10, , 11F
另外請想是否有地方有文件可看 關於OS這樣的設計機制OR原因
04/18 14:10, 11F

04/18 14:17, , 12F
想請問
04/18 14:17, 12F

04/18 14:35, , 13F
上面顯示的不是實體記憶體, 不用太著急...
04/18 14:35, 13F

04/18 14:51, , 14F
我覺得只要確定有正確的free,剩下的就不用擔心了
04/18 14:51, 14F

04/18 15:03, , 15F
疑不對, 是實體記憶體..= __ =
04/18 15:03, 15F

04/18 15:47, , 16F
哪裡可以看...一般的OS書都會講吧= =?
04/18 15:47, 16F

04/18 15:53, , 17F
樓上你可能誤會了 我說的是指 確定有寫2008 32bit 採取這種
04/18 15:53, 17F

04/18 15:53, , 18F
方式實做記憶體管理的文件 不是指教科書上有這種管理方式
04/18 15:53, 18F
文章代碼(AID): #1Dgz9Rjo (C_and_CPP)