一種不易察覺的記憶體洩露 (轉)
一種不易察覺的洩露
電子科技大學
朱寧
---- 最近,筆者用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- EntityDataSource不易察覺的錯誤
- 記憶體洩露記憶體洩露
- 轉載 ]查詢Windows記憶體洩露的幾種方法Windows記憶體洩露
- [譯]記憶體洩露的八種花樣記憶體洩露
- js記憶體洩露JS記憶體洩露
- JavaScript記憶體洩露JavaScript記憶體洩露
- 記憶體洩露嗎記憶體洩露
- SHBrowseForFolder 記憶體洩露記憶體洩露
- js記憶體洩露的原因JS記憶體洩露
- Java記憶體洩露的原因Java記憶體洩露
- JAVA 記憶體洩露的理解Java記憶體洩露
- IE中的記憶體洩露記憶體洩露
- 記一次Go websocket 專案記憶體洩露排查 + 使用Go pprof定位記憶體洩露GoWeb記憶體洩露
- 記憶體溢位和記憶體洩露記憶體溢位記憶體洩露
- Lowmemorykiller記憶體洩露分析記憶體洩露
- js引起記憶體洩露的幾種情況分析JS記憶體洩露
- JavaScript 中 4 種常見的記憶體洩露陷阱JavaScript記憶體洩露
- JavaScript 記憶體洩露的4種方式及如何避免JavaScript記憶體洩露
- 記憶體洩露引起的問題記憶體洩露
- JavaScript中的記憶體洩露模式JavaScript記憶體洩露模式
- ThreaLocal記憶體洩露的問題記憶體洩露
- [翻譯]查詢Windows記憶體洩露的幾種方法Windows記憶體洩露
- java 產生一個Java的記憶體洩露Java記憶體洩露
- 記一次"記憶體洩露"排查過程記憶體洩露
- 處理記憶體洩漏的一種MFC方法 (轉)記憶體
- 使用 mtrace 分析 “記憶體洩露”記憶體洩露
- 實戰Go記憶體洩露Go記憶體洩露
- 學習Java:記憶體洩露Java記憶體洩露
- 一個 Vue 頁面的記憶體洩露分析Vue記憶體洩露
- 一個Vue頁面的記憶體洩露分析Vue記憶體洩露
- 如何避免JavaScript的記憶體洩露及記憶體管理技巧JavaScript記憶體洩露
- ArkTS 的記憶體快照與記憶體洩露除錯記憶體洩露除錯
- python 記憶體洩露的診斷Python記憶體洩露
- 可能會導致.NET記憶體洩露的8種行為記憶體洩露
- Android 記憶體洩露詳解Android記憶體洩露
- 線上記憶體洩露定位--memleak工具記憶體洩露
- Pprof定位Go程式記憶體洩露Go記憶體洩露
- Android 檢測記憶體洩露Android記憶體洩露