在 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,在預計之中..

memory_leak(1).png 

2. 按下任意鍵後,由於之前的 memory 都沒釋放,所以變成了 64MB...

memory_leak (2).png 

3. 多按幾下後,你會發現你的電腦就快反應不過來,已經在濱當機狀態了,下面這張圖已經吃到120MB的記憶體了

memory_leak (3).png 

我是這麼查有沒有 memory leak 的

如果你有更好的方法,歡迎提供

arrow
arrow
    全站熱搜

    Edison 發表在 痞客邦 留言(1) 人氣()