1. 程式人生 > >關於C++記憶體洩漏的一個經驗教訓

關於C++記憶體洩漏的一個經驗教訓

       近期寫了一段程式碼,發現有記憶體洩漏,經多次查詢都找不到源點,搞到焦頭爛額,最後經同事細心審查,競是粗心導致的隱藏性錯誤,為了在以後避免犯同樣的錯誤,有必有記錄下來。

       在C++中記憶體管理是很重要的,特別是在new 出記憶體後,一定要用到相應的delete釋放記憶體,否則就會出現記憶體洩漏。其實,一般寫程式碼都會有這種意識,但有時自以為是的操作,卻不經意引起記憶體洩漏。

      具體情況大體是如下:

在一個類中

H:

     class A

   {

private:

int* m_pArrData;

public:

A();

~A():

void Function();

   }


cpp:

A::A()

{

m_pArrData=NULL;

}

A::~A()

{

delete []m_pArrData;

}

void A::Function()

{

m_pArrData=new int[100];

}

本以為成員變數m_pArrData在類解構函式中釋放記憶體就行了,但實際上這樣做是存在記憶體洩漏風險的,這取決於Function()函式呼叫次用,如果只調用一次,m_pArrData只分配一次記憶體,當然在物件析構時可以正確釋放記憶體。但是,當Function()函式要被多次呼叫,每次呼叫都用申請記憶體,然而m_pArrData只能指向最後一次申請的記憶體地址,物件析構後只會釋放最後一次new出來的記憶體,這樣之前申請的記憶體不但沒有釋放,而且也沒有指引,不能被釋放,一直被佔用,直到電腦重啟才會釋放,這樣會告成嚴重的記憶體洩漏。

所以,當用到要new記憶體的指標成員變數時,在成員函式中new記憶體時一定要注意。如上Funtion()函式,可以這樣修改:

void A::Function()

{

if(NULL!=m_pArrData)

        {

m_pArrData=new [100];

        }

}


或當申請空間大小已知時,直接在建構函式中申請空間,在解構函式中釋放。