現象:
視圖類中響應消息時調用對話框
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()每次都能返回正確的視圖對象指針.....