关于模态对话框内存管理的疑问

WeirdGuy 2009-08-18 03:41:48
CDlgA, CDlgB

CDlgA上放一个按钮
void CDlgA::OnButton1()
{
CDlgB dlgB;
dlgB.DoModal();
}

dlgB上拖几个什么listctrl啊,edit,button,static的控件上去,不做任何操作,只是放哪里多占内存而已。

就这么简单的东西,我纳闷的是,我点击一次按钮后就手动关闭CDlgB窗口。
按道理是dlgB是临时变量,domodal后dlgB也销毁了窗口对象,不会有有内存增长吧,
你这么试几次绝对不会,当我连续按的很快,并且不停的按ESC键销毁dlgB的时候,大概10几次
内存开始4k 4k的增长了,再按10几次,又涨4k,搞笑了,最小化dlgA内存也不会小。

注意我说的内存是指我在任务管理器看的“虚拟内存”,看那个“内存”没用,虚拟内存才是真正的。
有没有仁兄做一下测试,我是郁闷了,难道是windows自己内存管理机制导致的?但是不可能只增不减啊。
...全文
158 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
WeirdGuy 2009-08-19
  • 打赏
  • 举报
回复
还是没答案,呵呵
wu_qing_yun 2009-08-18
  • 打赏
  • 举报
回复
关注,以前就发过类似的帖子,模态对话框的内存问题,哎……
superdiablo 2009-08-18
  • 打赏
  • 举报
回复
这个现象我也观察过,不知道准确原因,只得出一个结论:看是否有内存泄漏K量级不能作为判断依据,最少要M量级才有说服力。
  • 打赏
  • 举报
回复
有意思...
捕鲸叉 2009-08-18
  • 打赏
  • 举报
回复
如果出现上述情况,首先要检查你自己的代码,如果是windows犯的错误,那微软也别那么牛气了,你可以去询问他们
MoXiaoRab 2009-08-18
  • 打赏
  • 举报
回复
这个解释起来有点复杂,建议你看看《逆向MFC》

我要下线了,有空一起交流
WeirdGuy 2009-08-18
  • 打赏
  • 举报
回复
另外,我以前几乎不写GUI的程序,再多new,delete,都没出现这种情况的,为了好的防止内存碎片,用了slab自己处理,所以以前几乎没见过这种搞笑的事情。

医用mfc,按道理,这些变量都是在stack上的吧,怎么会引起内存分页呢?
MoXiaoRab 2009-08-18
  • 打赏
  • 举报
回复
我用Windows 7 1年了。Windows 7貌似改进了很多方面,今天你这一提醒,我倒发现了优势。

看完Windows源码的人不是没有,你也不能一棍子打死是吧?
CSDN不是追求真理的地方,那什么地方是呢?恐怕只有自己
WeirdGuy 2009-08-18
  • 打赏
  • 举报
回复
我一直用了6年的2003了,从来不用XP,又叫人家看代码,linux代码公开了那么多年了,估计真正看完TCP/IP部分的没几个,CSDN不是最追真理的地方,而是寻求解决办法寻求帮助的地方,全中国有多少程序员看完了windows源码或者linux源码?

BTW:啥子好玩的东西
MoXiaoRab 2009-08-18
  • 打赏
  • 举报
回复
XP可能内存管理上还是不那么完美,我的系统果然进行了改进,释放得很快,20K花了3分钟就自动释放了
MoXiaoRab 2009-08-18
  • 打赏
  • 举报
回复
哇哈哈,我发现个好玩的东西。你用的是不是XP?
MoXiaoRab 2009-08-18
  • 打赏
  • 举报
回复
说了,Windows源码看过才知道,我没看过,所以不知道
WeirdGuy 2009-08-18
  • 打赏
  • 举报
回复
我露相了,要解释就解释清楚,问题摆在面前的实际情况就是一个小时了,虚拟内存还是占用1584k,我想如果我继续测试下去它还会继续增加,操作系统内部页面算法怎么实现,其实不是重点,重点是它什么时候会释放,没研究过OS的程序员肯定都会关心这个,而不关心内部算法。
楼上高人,你能否告诉我什么情况下1584k会释放到原始的1544k呢?以及什么时候?
MoXiaoRab 2009-08-18
  • 打赏
  • 举报
回复
好吧,我错了。原来楼主真人不露相....
监视机制去研究Windows源码才行啊,我这边源码没研究过,一直没空
WeirdGuy 2009-08-18
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 tr0j4n 的回复:]
不是永远不会,是肯定会。
我想你肯定没学过《操作系统原理》这门课吧?里面讲内存页置换算法的,系统的监视机制不是你想的那么简单。系统释放用的就是这个NativeAPI,不过那是在他检测到之后再调用,现在你直接调用,是立刻整理
[/Quote]

呵呵,不要动不动就说别人没学过,探讨而已,page页面的算法看过,我问题不是这个,我问题是操作系统的监视机制是什么,就是什么情况下触发他释放?
MoXiaoRab 2009-08-18
  • 打赏
  • 举报
回复
不是永远不会,是肯定会。
我想你肯定没学过《操作系统原理》这门课吧?里面讲内存页置换算法的,系统的监视机制不是你想的那么简单。系统释放用的就是这个NativeAPI,不过那是在他检测到之后再调用,现在你直接调用,是立刻整理
WeirdGuy 2009-08-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 tr0j4n 的回复:]
知道为什么是4k吗?因为正好是一页的大小,这就是虚拟内存里的碎片页

当页因为系统的LRU算法检测到之后,将其换出,内存就释放掉了
[/Quote]

请问楼上的,那要等到什么时候才会释放,如果不用这个Native API,是否就永久不会
释放,或者说这个运行的这个测试程序test重新申请内存的时候操作系统才会释放之前的碎片??
雪影 2009-08-18
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 weirdguy 的回复:]
引用 14 楼 x22ray 的回复:
我试了下,也是4k的增,4k是不是一个内存页的大小呢。等了半天也不见占用减少。。期待解答

是啊,现在还是1584呢,等了半个钟了,楼上有兄弟说可以恢复,我看他是不是看成“内存”,而不是
“虚拟内存”,期待达人解释
[/Quote]
我的也是虚拟内存,估计是操作系统的原因,虚拟内存整理的速度没跟上
MoXiaoRab 2009-08-18
  • 打赏
  • 举报
回复
如果你认为系统整理内存太慢,可以手动自己整理,参考 这里

用Native API
MoXiaoRab 2009-08-18
  • 打赏
  • 举报
回复
知道为什么是4k吗?因为正好是一页的大小,这就是虚拟内存里的碎片页

当页因为系统的LRU算法检测到之后,将其换出,内存就释放掉了
加载更多回复(15)

16,471

社区成员

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

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

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