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()每次都能返回正确的视图对象指针.....

你可能感兴趣的:(测试,mfc,distance)