C語言中的malloc和free造成內存泄露?

 來源:http://blog.csdn.net/Leisure512/article/details/4787585

 

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

 

 

  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. int main(){  
  4.     int *pint=(int *)malloc(sizeof(int));  
  5.     int *pp=(int *)malloc(sizeof(int));  
  6.     char *pchar=(char*)pint;  
  7.     *pp=16705;  
  8.     *pint=16705;  
  9.     free(pchar);  
  10.     free(pp);  
  11.     return 0;  
  12. }  

  

 

然後,使用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掉)

 

發佈了27 篇原創文章 · 獲贊 21 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章