MFC的窗口類虛函數PostNcDestroy使用應注意

產生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的出處。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章