首页
社区
课程
招聘
[分享]非模态对话框例子存在内存泄露问题
发表于: 2008-10-10 17:42 7897

[分享]非模态对话框例子存在内存泄露问题

2008-10-10 17:42
7897
最近正在读你的《windows 编程循序渐进》,对我这个初学者很有帮助

第二章 创建的非模态对话框的例子里, 实际上是存在内存泄露的,  因为没有delete 指向对话框的指针, 这一点可以在debug结束后的报告里看到。

我想最简单的解决方法可以override掉OnCancel(),PostNcDestroy() 函数。

void CMyNoModalDialog::OnCancel()
{
      DestroyWindow();
}

void CMyNoModalDialog::PostNcDestroy()
{
     delete this;   //删除对话框指针

     CDialog::PostNcDestroy();
}

CWnd::DestroyWindow 会发送WM_DESTROY 和 WM_NCDESTROY 消息,来销毁窗口。PostNcDestroy() 是销毁非客户端窗口最后调用的一个函数OnNcDestroy()所调用的一个虚函数,在这里可以处理我们自己的清楚工作,例如delete指针。

通常非模态对话框的确定按钮彼岸时确认所填写的数据或者所做的选择,而取消按钮或者系统菜单的叉叉是退出该对话框,因此我们只要关注OnCancel()就可以了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
2
感谢提出问题。
解决方法:把对话框定义为CMyNoModalDialog类的成员变量,然后在OnCancel或者重载WM_DESTORY中delete即可。
2008-10-10 22:48
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我想初学者应该不会考虑到这种问题的。 受教了。
2008-10-18 09:38
0
雪    币: 247
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
实际上,我也只是想到在学c++的时候用new在heap中创建的指针,最后都应该在使用完后delete掉,所以才会想到这个问题的,呵呵,对于MFC我的确是初学者。
2008-10-18 13:58
0
雪    币: 299
活跃值: (25)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
5
莫怕,Ring3的程序,漏了就漏了。
2008-11-11 11:27
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6

Ring3下面漏的程序不少哦~

受教了,养成做善后工作的习惯。。。
2008-11-11 11:58
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
书在china-pub上买的,快送到了,仔细学习一下。还可以和作者交流,真是不错~~
2008-12-16 22:58
0
游客
登录 | 注册 方可回帖
返回
//