關於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];
}
}
或當申請空間大小已知時,直接在建構函式中申請空間,在解構函式中釋放。