MFC臨時對象的所產生的BUG

現象:

視圖類中響應消息時調用對話框

 CDlgConfig dlg(this);
 if(dlg.DoModal() == IDOK)
 {
//  SaveConfig();
 }

在對話框構造參數中調用:

CCapTestView * m_pParent = GetParent();
 m_FourMin = m_pParent->m_FourMin;
 m_EMin = m_pParent->m_EMin;
 m_Distance = m_pParent->m_Distance; 

 數據獲取一切正常

然而在對話框的Onok中調用:

 CCapTestView *pView =GetParent();

 pView->m_FourMin= m_FourMin ;
 pView->m_EMin=m_EMin;
 pView->m_Distance=m_Distance;

在程序退出時竟然當掉了.指向的錯誤位置讓人莫名其妙.堆棧爲app對象-frame關閉時當掉,爲什麼呢?測試後發現只要不調用pView->m_EMin=m_EMin;就不會出錯, 真的是.........faint,完全不沾邊啊

在修改測試大半個小時後,發現給視圖POST消息就正常,在對話框內調視圖函數就出錯,最後終於發現BUG就出在CCapTestView *pView =GetParent();

MFC源碼爲:

_AFXWIN_INLINE CWnd* CWnd::GetParent() const
 { ASSERT(::IsWindow(m_hWnd)); return CWnd::FromHandle(::GetParent(m_hWnd)); } 

FromHandle返回一個與窗口關聯的臨時對象指針,這個對象不見得就是原來的那個視圖.所以在構造函數時調用時得到的指針正好是原來的視圖對象,但是後來得到的就可能出錯了,所以訪問其成員數據就造成了內存的錯誤,導致程序退出時當掉.

只是不明白爲何在構造參數內調用GetParent()每次都能返回正確的視圖對象指針.....

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