销毁非模态窗体产生的4K内存泄露问题

yanshu117 2008-01-29 11:52:41
最近做程序需要用到动态创建和销毁非模态窗体,于是我做了下面的极限测试
while(1)
{
dlg=new CDlgEx();
dlg->Create(IDD_DIALOG1);
dlg->ShowWindow(SW_SHOW);
delete dlg;
}
但是发现会产生4K步长的内存泄露,后来查资料,看一朋友说CWND继承的对象,如果外部销毁会有4K的内存泄露,于是按他的提示该成如下:在CDlgEx()中定义一个void Quit()
{
DestroyWindow();
}
在void CDlgEx::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;//这句加上一句前面 和后面都试过
}
然后在主窗体中
while(1)
{
dlg=new CDlgEx();
dlg->Create(IDD_DIALOG1);
dlg->ShowWindow(SW_SHOW);
dlg->Quit();
}
可是还是不好用....郁闷
最后看一个人的帖子http://www.21tx.com/dev/2005/05/06/11661.html决定用他的方法 可是还是不好用,不知道为什么,希望大家帮我看看,郁闷,如果 有好方法请大家留下言吧,或加我QQ 164189616交流,非常感谢
...全文
224 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
crumpy 2008-02-14
  • 打赏
  • 举报
回复
祝你好运, 如果解决了, 请告诉一声, 谢谢了8-)

另外MSDN上有一个已知BUG: BUG: 嵌套对话框框泄漏内存
yanshu117 2008-02-14
  • 打赏
  • 举报
回复
TO:crumpy
不是吧.这个真让我郁闷,我在想想别的办法吧,谢谢你了.
crumpy 2008-02-14
  • 打赏
  • 举报
回复
to yanshu117:

我不知道原因了, 不会是有问题的机器没打好补丁呢?

报告给MS吧, 没准真是BUG呢, 呵呵
yanshu117 2008-02-14
  • 打赏
  • 举报
回复
TO:crumpy
你说的原因我看了.但是,我那个非模态窗体上什么也没有呀,我把那窗体上所有的控件都去掉了。 按说没有不被自动处理机制清除的对象了.但还是有内存泄露,郁闷(另外我发现一个有趣的现象,我在我的本子上做这程序 好像就没有内存泄露,而在公司的电脑上就有内存泄露,我怀疑是不是CPU的问题,我本子的CPU是AMD 64BIT 双核 公司电脑的CPU是AMD的普通CPU)
w_anthony 2008-02-01
  • 打赏
  • 举报
回复
这个问题以前一直没注意,听LZ一说,去试了一遍,发现果然如此!
从代码层面上来说直接调用delete dlg也未尝不可,那个warning只是警告OnDestroy和PostNcDestroy不会被调用到,而实际上在CDialog里面,这两个函数是不做任何处理的,不调用也没什么影响。
另外值得注意的是,即便是先调用dlg->DestroyWindow,再delete dlg,实际上那两个函数也一样不会调用到,因为主动DestroyWindow之后句柄已经销毁了。
再者,就算是自己先调用SendMessage(WM_DESTROY)和dlg->PostNcDestroy也泄漏,再或者在PostMessage(WM_CLOSE)之后用PeekMessage把所有属于这个句柄的消息都处理掉,泄漏依然存在。
一时间想不到泄漏发生在哪里,于是作了如下测试:
while(1)
{
CDlgEx dlg;
dlg-> DoModal();
}
在CDlgEx的OnInitDialog()里面调用PostMessage(WM_COMMAND, IDCANCEL, 0),相当于点击了取消按钮。
结果、结果,泄漏依然存在,囧……
估计是windows自己的问题了。
crumpy 2008-02-01
  • 打赏
  • 举报
回复
似乎找到出处了, 看这个: TN017: Destroying Window Objects
crumpy 2008-01-31
  • 打赏
  • 举报
回复
不知道你的CDlgEx类里定义了什么内存或资源还是仅仅一个空的Dialog?

这样呢?
dlg->ShowWindow( SW_HIDE );
dlg->DestroyWindow();
delete dlg;
phoenix_fei 2008-01-31
  • 打赏
  • 举报
回复
学习,不知道原因..
Hiiishe 2008-01-31
  • 打赏
  • 举报
回复
不建议delete dlg
建议dlg->DestroyWindow
wumuyishu 2008-01-31
  • 打赏
  • 举报
回复
Warning: calling DestroyWindow in CDialog::~CDialog --
OnDestroy or PostNcDestroy in derived class will not be called.

这是VS2003的提示 楼上的解决方案完全正确
主要是你没有通过正常途径关闭窗口 WM_DESTRORY消息没有被被调用过

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧