产生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的出处。