现象:
视图类中响应消息时调用对话框
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()每次都能返回正确的视图对象指针.....