來源:http://blog.csdn.net/Leisure512/article/details/4787585
首先,說一下我對內存泄露的理解,內存泄露是指:程序中一塊不再使用的內存沒有被釋放,造成內存保持佔用狀態,使操作系統不能將內存分配給其它的程序(進程)。在C語言,用的最多的管理內存的函數莫過於malloc和free了,下面我用VC6.0做了一個小測試,源碼如下:
- #include<stdio.h>
- #include<stdlib.h>
- int main(){
- int *pint=(int *)malloc(sizeof(int));
- int *pp=(int *)malloc(sizeof(int));
- char *pchar=(char*)pint;
- *pp=16705;
- *pint=16705;
- free(pchar);
- free(pp);
- return 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掉)