1. 程式人生 > >C語言中的malloc和free造成記憶體洩露?

C語言中的malloc和free造成記憶體洩露?

      首先,說一下我對記憶體洩露的理解,記憶體洩露是指:程式中一塊不再使用的記憶體沒有被釋放,造成記憶體保持佔用狀態,使作業系統不能將記憶體分配給其它的程式(程序)。在C語言,用的最多的管理記憶體的函式莫過於malloc和free了,下面我用VC6.0做了一個小測試,原始碼如下:

 

  

然後,使用VC6.0來除錯這個程式,單步執行,對於這個程式,沒有step in的地方,除非你要想去看看malloc和free怎麼執行。我全部使用單步執行(step out)。下面有一些截圖:

                             圖1.執行完兩條malloc以後

從圖1可以看到,VC實現的malloc函式給連續宣告的兩個int變數分配的記憶體相隔很遠!

                         圖2.pint地址的內容

從圖2中可以看到,由於沒有給*pint賦值,所以這塊記憶體中的值為dirty。

現在將pint強制轉換成char *,然後賦給pchar,現在pchar和pint指向同一個記憶體地址,現在給*pint賦值為16705,這個值是特別設計的,因為它的有效的兩個位元組轉化成ASCII碼後是AA,從圖3中可以看出,當前PC上的記憶體是小端對其的。

                     圖3.給*pint賦值後

賦值以後檢視*pchar和pchar記憶體的內容,如下:

                      圖4.賦值以後的變數

從圖4中可以看到,*pchar表示一個char值'A',而pchar是一個字串"AA",因為char *可以指向一個字串的首地址,而字串以字元'/0'結束,也就是整數0結束。而這時從圖3中可以看到,記憶體中的值為41410000...,轉換成ASCII碼就是AA,然後跟上結束符。

現在該執行free了,如下圖

                     圖5.free(pchar)執行以後的記憶體圖

可以看到,free(pchar)這個char *一共free了9個位元組的記憶體!然後執行下一句,如下圖

                   圖6.free(pp)執行以後的記憶體圖

從圖6中可以看到,free一個int*時,free掉了10個位元組的記憶體!

      最後,從上面的實驗中是否可以得出下列結論呢?

1.malloc分配的記憶體至少要滿足請求的記憶體大小

2.即使兩個變數相鄰使用malloc分配獲得的記憶體地址也相隔甚遠

3.將int*強制轉換成char*後,會造成記憶體洩露(如上例中,有一個位元組沒有被free掉)