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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值