在 09_二維指標與陣列 - 動態配置 [m][n] 陣列 中我們有提到
如果每 malloc 一份 memory 但卻沒有釋放,
將造成 memory leak 問題,一般而言程式真的不好抓,
(特別是已經寫了四、五千行程式要更很麻煩)
因為就算不釋放,你的程式仍然可以執行,但執行到後來可能會出現:
"虛擬記憶體不足,程式即將關閉" 之類的,而且也不是每次都會出現,
這是要看 memory leak 的程度。
一般而言,即使你忘了進行釋放記憶體 free 的動作
C/C++ 多少都會幫你自動釋放,但並不保證一定會幫你正常準確釋放,
通常在配置一維陣列的時候自動釋放的機率較高,以下例子是在說明沒正釋放時會發生什麼情形...
最後,我比較建議每次寫程式的時候就先小小測試一下會不會有 memory leak 的現象
以下這個例子,如果你覺得自己電腦算不錯,那就拿來跑看看,
(我的電腦是有點弱,所以我跑一次就當機,只能重新開機)
為了明顯的顯示其 memory leak 現象,我每次配置的空間都很大,
一次配置 2000 * 4000 * 4bytes (整數32bits = 4bytes) = 32MB 的空間
原始碼:
// ====================================
// FileName: memory_leak.cpp
// Author : Edison.Shih.
// Complier: VC 2008
#include <stdio.h.>
#include <stdlib.h>
#define ROW 2000
#define COL 4000
#define LOOP_CNT 1000
// ====================================
int main(int argc, char **argv)
{
int i=0, j=0;
int **ptr2 = NULL;
for(i=0; i<LOOP_CNT; i++)
{
ptr2 = (int**)malloc(sizeof(int*)*ROW);
for(j=0; j<ROW; j++) ptr2[i] = (int*)malloc(sizeof(int)*COL);
// for(i=0; i<ROW; i++) free(ptr2[i]);
// free(ptr2);
system("pause");
}
return 0;
}
執行結果:
0. 在程式執行時,請叫出你的工作管理員,並切到 "處理程序" 去找你的程式名稱,以我的例子,程式名稱是"memory_leak.exe"
1. 一開始執行時,請注意,memory_leak.exe 吃了 32MB,在預計之中..
2. 按下任意鍵後,由於之前的 memory 都沒釋放,所以變成了 64MB...
3. 多按幾下後,你會發現你的電腦就快反應不過來,已經在濱當機狀態了,下面這張圖已經吃到120MB的記憶體了
我是這麼查有沒有 memory leak 的
如果你有更好的方法,歡迎提供