一種不易察覺的記憶體洩露 (轉)

worldblog發表於2007-12-04
一種不易察覺的記憶體洩露 (轉)[@more@]

一種不易察覺的洩露

電子科技大學
朱寧

---- 最近,筆者用VC++編寫一個螢幕保護的時候,發現了記憶體洩露的問題,感到 非常困惑。後來,在參考幾個例子的基礎上,解決了這個問題。下面讓我們分析 其原因和處理方法:

---- 筆者由CWnd派生了一個子類CDrawWnd, 在主程式類的InitInstance()中新增了 如下程式碼:

m_pMainWnd=new CDrawWnd(); m_pMainWnd- >Create(.....); return TRUE;


---- 在執行透過後,VC++的偵錯程式報告記憶體洩露。顯然,問題只可能出在上面的 第一行程式碼上。開始我編寫上述程式碼時,也懷疑 new 沒有對應的 delete ,將導 致堆記憶體無法收回,但是,參考VC++5.0的例子 "Hello" ,該程式這部分的程式碼 與上述無異,也沒有其他delete 回收堆記憶體,但並不造成記憶體洩露。 檢視VC++的線上幫助,並沒有詳細的說明,只是說關閉視窗時,自動呼叫虛擬函式 PostNCDestory回收m_pMainWnd指向的記憶體.

---- 於是筆者嘗試在主程式類的解構函式中呼叫 delete m_pMainWnd ,沒有效果。顯式 呼叫CWnd::DestoryWindow()也不起作用。參考例子saver, 發現它前面的實現程式碼 與筆者的完全相同,但是,它在CDrawWnd類中過載了PostNCDestory虛擬函式,其中 有一行關鍵的程式碼:

delete this;


---- 事實上,是它銷燬了CDrawWnd。

---- 於是立刻修改了我的程式,在主視窗類中過載了PostNCDestory函式,加入以上語 句,立刻解決了記憶體洩露的問題。

---- 原因終於明白了,原來,如果程式主視窗類是從CFrameWnd繼承的,不需要人工 回收類物件佔用的記憶體,象"hello"例子就是這樣的程式。但是如果是從Cwnd類 直接繼承的主視窗類,就必須考慮這個問題。


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987971/,如需轉載,請註明出處,否則將追究法律責任。

相關文章