CloudWalk
驱动牛犊
驱动牛犊
  • 注册日期2004-10-31
  • 最后登录2005-04-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1828回复:8

关于销毁一个窗口后,内存使用量依然保持不变的MFC问题

楼主#
更多 发布于:2004-12-19 19:35
   最近遇到这么一个问题,想请教诸位:
   我创建一个窗口后,销毁它。根据习惯思维方式,这个窗口所占用的内存应该被释放掉了。但事实上不。用资源管理器里一直盯着,我发现,只要创建一个新窗口,该程序的内存占用量自然会上升,但是在销毁该窗口之后,却并没有任何的减少。
  
   这让我觉得有些奇怪。想请教对此有研究的朋友。

   我的例子是用VC6创建一个基于对话框的工程,主对话框类名为CDiagTest,然后再增加一个新的对话框,并用ClassWizard将该新对话框定义为如CNewDiag, 然后在在CDiagTest的OnOK()中加入几句:
    CDiagNew *dlg;    
    dlg = new CDiagNew();
    int nResponse = dlg->DoModal();
    delete dlg;
s_6666_s_qd
驱动巨牛
驱动巨牛
  • 注册日期2004-08-14
  • 最后登录2006-07-11
  • 粉丝0
  • 关注0
  • 积分199分
  • 威望22点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-22 16:12
CDiagNew *dlg;
dlg = new CDiagNew();
int nResponse = dlg->DoModal();
dlg = NULL;
delete dlg;
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-22 17:03
CDiagNew *dlg;
dlg = new CDiagNew();
int nResponse = dlg->DoModal();
dlg = NULL;
delete dlg;
 

哈哈,这样也可以?不出错找我
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-22 21:39
[quote]CDiagNew *dlg;
dlg = new CDiagNew();
int nResponse = dlg->DoModal();
dlg = NULL;
delete dlg;
 

哈哈,这样也可以?不出错找我 [/quote]
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-22 21:44
  最近遇到这么一个问题,想请教诸位:
   我创建一个窗口后,销毁它。根据习惯思维方式,这个窗口所占用的内存应该被释放掉了。但事实上不。用资源管理器里一直盯着,我发现,只要创建一个新窗口,该程序的内存占用量自然会上升,但是在销毁该窗口之后,却并没有任何的减少。
  
   这让我觉得有些奇怪。想请教对此有研究的朋友。

   我的例子是用VC6创建一个基于对话框的工程,主对话框类名为CDiagTest,然后再增加一个新的对话框,并用ClassWizard将该新对话框定义为如CNewDiag, 然后在在CDiagTest的OnOK()中加入几句:
    CDiagNew *dlg;    
    dlg = new CDiagNew();
    int nResponse = dlg->DoModal();
    delete dlg;
 


通常你不会找得到一种安全的办法来清理内存,建议在对话框内部使用自销毁,看看 MSDN 中关于对话框的帮助吧
这里你只需要在尾部加一句 dlg = NULL;就可以了
CloudWalk
驱动牛犊
驱动牛犊
  • 注册日期2004-10-31
  • 最后登录2005-04-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-25 14:14

通常你不会找得到一种安全的办法来清理内存,建议在对话框内部使用自销毁,看看 MSDN 中关于对话框的帮助吧
这里你只需要在尾部加一句 dlg = NULL;就可以了


谢谢xx_focus的回答。
“通常你不会找得到一种安全的办法来清理内存”。。。
我想请教的是,如果不是“通常”呢?:)
有无可能的办法?

另外,将dlg置空的作用应该是避免该指针变为野指针吧。但似乎与我的清理内存的初衷帮助不大,因为一旦销毁该窗口之后,相关的一切是都不会再使用的了。
vc程序员
驱动牛犊
驱动牛犊
  • 注册日期2004-12-25
  • 最后登录2004-12-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-25 16:58
内存是由MFC来管理的,什么时候释放是它的事情...
...忘记了听哪位高人说要站在巨人的肩膀上(候捷?) ...当今的程序设计 ...不见得必须要把巨人做的事情做一遍 ...但是,起码要明白巨人是怎么做的
CloudWalk
驱动牛犊
驱动牛犊
  • 注册日期2004-10-31
  • 最后登录2005-04-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-25 22:17
内存是由MFC来管理的,什么时候释放是它的事情...


Bingo!!! It's what I'm looking for.

能否请vc程序员详细解释一下MFC里的管理过程?
另外,如果MFC可以做的话,我们是否自然也可以吧?。。。
CloudWalk
驱动牛犊
驱动牛犊
  • 注册日期2004-10-31
  • 最后登录2005-04-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-25 22:26
[quote]内存是由MFC来管理的,什么时候释放是它的事情...


Bingo!!! It's what I'm looking for.

能否请vc程序员详细解释一下MFC里的管理过程?
另外,如果MFC可以做的话,我们是否自然也可以吧?。。。
 [/quote]

或者指点一下迷津也好,比如哪本书介绍这方面的内容比较详细具体,网上哪篇文章点中了要害。。。
总比我一直为此迷惑要强啊 谢谢了:)
游客

返回顶部