產生BUG的代碼:
添加虛函數
void CMainFrame::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
// if(m_bTimer)
{
KillTimer(1);
m_bTimer = FALSE;
}
CFrameWnd::PostNcDestroy();
}
現象很可笑,程序只是退出時"嗡"的一聲,DEBUG窗口只有一個警告,線程退出代碼爲3.
暈乎乎,仔細跟蹤了一下,發現CMainFrame的析構函數不進入了,而文檔和視圖的析構函數都正常,
沒有析構應該會泄露,也沒見報泄露,鬱悶了.整了半個多小時,不知道爲什麼.
沒辦法,重啓機器,再進行編譯,發現終於報泄露了,而且還不少.CMainFrame中只要是create和new的全泄露了.
爲什麼析構函數不進入了呢????在代碼退出的地方找來找去,最後終於看到文章開頭加的那段代碼,是用來在退出時
刪除定時器的.由於一次改的地方太多,出現問題後不能確定究竟是哪地方加出來的問題,而且很自信的認爲這個地方
根本就不會出問題的,總共就才兩句代碼,所以大意了,結果浪費不少時間.
分析:
PostNcDestroy和KillTimer,進入PostNcDestroy後,CMainFrame的m_hWnd指針已爲空,已經在Cwnd()的CWnd::OnNcDestroy()中Detach()了,所以KillTimer失敗,因爲這是MFC把Api的KillTimer包裝的,所以沒有句柄參數,
原API的第一個參數是hwnd,hwnd爲空後KillTimer導致程序異常中止,後面的代碼都不被執行,所以造成了一系列的
泄露.
總結:
一、在PostNcDestroy中慎用窗口句柄相關的MFC函數操作,後果不能確定.
二、一次修改代碼不要改多個地方,否則出了BUG很難回顧判定BUG的出處。