MFC的窗口类虚函数PostNcDestroy使用应注意

产生BUG的代码:

添加虚函数
void CMainFrame::PostNcDestroy()
{
 // TODO: Add your specialized code here and/or call the base class
// if(m_bTimer)
 {
  KillTimer(1);
  m_bTimer = FALSE; 
 } 
 CFrameWnd::PostNcDestroy();

现象很可笑,程序只是退出时"嗡"的一声,DEBUG窗口只有一个警告,线程退出代码为3.

晕乎乎,仔细跟踪了一下,发现CMainFrame的析构函数不进入了,而文档和视图的析构函数都正常,

没有析构应该会泄露,也没见报泄露,郁闷了.整了半个多小时,不知道为什么.

没办法,重启机器,再进行编译,发现终于报泄露了,而且还不少.CMainFrame中只要是create和new的全泄露了.

为什么析构函数不进入了呢????在代码退出的地方找来找去,最后终于看到文章开头加的那段代码,是用来在退出时

删除定时器的.由于一次改的地方太多,出现问题后不能确定究竟是哪地方加出来的问题,而且很自信的认为这个地方

根本就不会出问题的,总共就才两句代码,所以大意了,结果浪费不少时间.

分析:

PostNcDestroy和KillTimer,进入PostNcDestroy后,CMainFrame的m_hWnd指针已为空,已经在Cwnd()的CWnd::OnNcDestroy()中Detach()了,所以KillTimer失败,因为这是MFC把Api的KillTimer包装的,所以没有句柄参数,

原API的第一个参数是hwnd,hwnd为空后KillTimer导致程序异常中止,后面的代码都不被执行,所以造成了一系列的

泄露.

总结:

一、在PostNcDestroy中慎用窗口句柄相关的MFC函数操作,后果不能确定.

二、一次修改代码不要改多个地方,否则出了BUG很难回顾判定BUG的出处。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值