利用任务管理器侦测GDI内存泄露

打开任务管理器,点击菜单“查看”——“选择列”,勾上所有项,“确定”。运行自己的程序,进行各种操作,并查看任务管理器中GDI对象和句柄数的变化。

        如果在某次可逆操作中,例如,弹出一个对话框,然后关闭,GDI对象或句柄数先增加了,然后减少了,但是总量还是增加了,说明存在内存泄露,GDI对象没有被及时回收。如果句柄数出现类似情况,则情况复杂很多。

        接下来,注释掉某些代码,编译运行并继续观察,逐步定位导致内存泄露的代码段。

 

        实例:

        某程序运行时,弹出一个窗口,再关闭,GDI对象数目就增加了一个。经过一个多小时的分析,最后定位出问题所在,如下:

 LOGFONT logfont={0};

 GetObject(m_font, sizeof(logfont), &logfont);

 logfont.lfHeight = -MulDiv(size, GetDeviceCaps(::GetDC(NULL), LOGPIXELSY), 72);

 SetFont(&logfont);

        这段代码是用来改变窗口的字体大小的,size是字体的磅数,但是LOGFONT是按像素计算字体大小的,所以,需要转换字体的磅数为像素大小。这里只转换了高度,因为设置字体大小时,只需要高度就可以了。 logfont.lfHeight = -MulDiv(size, GetDeviceCaps(::GetDC(NULL), LOGPIXELSY), 72);  这句代码是从网上搜索到的、转换字体磅数为像素大小的代码,我也没有去细看,直接copy了一下,毕竟代码很短,乍一看,真没什么问题。然而,这里使用了GetDC,这将导致GDI对象增加,所以,应该调用DeleteDC回收,这就是问题所在。

修改后的代码为:

 LOGFONT logfont={0};

 GetObject(m_font, sizeof(logfont), &logfont);

 HDC hdc=::GetDC(NULL);

 ASSERT(hdc!=NULL);

 logfont.lfHeight = -MulDiv(size, GetDeviceCaps(hdc, LOGPIXELSY), 72);

 ::DeleteDC(hdc);

 SetFont(&logfont);

时间: 2024-09-30 00:38:08

利用任务管理器侦测GDI内存泄露的相关文章

Instruments指南:如何调试内存泄露

Instruments指南:如何调试内存泄露 开篇 现在,你应该使用的ARC,而不是原来我们使用的MRC或者其他.但是我们在使用ARC的时候也会出现内存泄露的情况. 幸运的是,苹果为我们提供了Instruments,他可以用来检测你的应用程序的内存泄露.可能刚学习iOS开发的开发者被这个工具给吓到了,里面有太多东西了.其实他们是非常了不起的,而且也非常容易使用. 在这篇文章里,你将会通过使用XCode和Instruments来调试和发现内存相关的问题(例如内存泄露). 开始使用 我们这篇文章的目

GDI对象导致内存泄露

最近在一个项目中,被测试组人员检测出来GDI对象导致内存泄露,之后,经过代码的走读,确实发现存在这样一个问题. 首先是现象,在一些项目中,如果发现图片,图标等突然显示不出来,就有可能是GDI对象已经满了,这个事情,用任务管理器,把GDI对象打开,就可以看到了,如果GDI对象迅速上涨,就基本可以确认是GDI对象导致内存泄露. 经过查证,发现以下代码会导致GDI对象上涨,内存泄露,因为以下代码会定时执行,每当一个执行周期一道,就会重新申请内存,导致泄露. m_switch_http.SetIcon(

对开发中常见的内存泄露,GDI泄露进行检测

  对开发中常见的内存泄露,GDI泄露进行检测 一.GDI泄露检测方法: 在软件测试阶段,可以通过procexp.exe 工具,或是通过任务管理器中选择GDI对象来查看软件GDI的对象是使用情况. 注意点:Create出来的GDI对象,都要用DeleteObject来释放:Create出来的DC,都要用DeleteDC来释放,GetDC得出的DC,要用ReleaseDC来释放.   以下是一些常用到的函数:   1.  检查GetWindowDC(), 后面是否有ReleaseDC(); 2. 

c#用gdi+绘图出现的内存泄露

问题描述 在用到bitmap.GetHbitmap()的函数时,在win10下有时候会出现内存泄露,在win8下却不会,这是错误代码以及我捕捉到的日志 解决方案 解决方案二:再看一遍什么东西没释放解决方案三:该释放了的都释放了,我感觉应该是这个图片本身有问题,但是不知道该怎么过滤解决方案四:直接用DrawImage就好了,你这样反而更慢了解决方案五:引用3楼woshixiaohongmao的回复: 直接用DrawImage就好了,你这样反而更慢了 但是直接用DrawImage它的尺寸总是不对,扩

利用linux的mtrace命令定位内存泄露(Memory Leak)

  一谈到内存泄露, 多数程序员都闻之色变. 没错, 内存泄露很容易引入, 但很难定位.  以你我的手机为例(假设不经常关机), 如果每天泄露一些内存, 那么开始的一个星期, 你会发现手机好好的, 当内存泄露积累到一定程度,  那就是各种卡死了, 系统异常, 最后死机, 不得不重启.         如果搞开发, 遇到内存泄露问题, 那就呵呵了. 你可能先得花好几天来复现问题(泄露积累), 然后需要花好几天来定位问题和修改问题, 然后又要花好几天来验证问题, 而且, 很有可能没法一次改好, 上述

小编教您解决Win8系统内存泄露问题

朋友的电脑是华硕S400CA,I7-3537U,4G内存,24+500G混合硬盘.开机一段时间后,内存就被占满了,接着就变得非常卡,甚至黑屏.死机.按理说这样的配置不至于会动不动就卡机,很有可能是出现内存泄露问题了. 可以看出,开机2个小时多,以提交内存已经超出物理内存,可用内存仅剩几百M,此时所有程序都反应缓慢,必须注销才能缓解.如果在任务管理器里重启Windows资源管理器进程,则会释放三四百兆的内存,但不到几秒就被吞没了. 虚拟内存一直是开着的,如果设置成自定义大小,则"以提交"

关于SetProcessWorkingSetSize方法的疑问 内存泄露

问题描述 使用SetProcessWorkingSetSize方法可以将进程占用的物理内存换出到虚拟内存中,这样做的好处是什么呢?难道就是为了换来程序消耗的内存很小的假象吗?使用SetProcessWorkingSetSize方法是否可以解决程序因内存不足而导致崩溃的问题呢?通过查阅资料,个人对这个方法持怀疑态度:因为网上资料说,该方法只是暂时的将应用程序占用的内存移至虚拟内存,一旦,应用程序被激活或者有操作请求时,这些内存又会被重新占用.所以我认为,就算将部分内存交换至虚拟内存,只要程序被使用

记录由Equal基础知识引起的内存泄露

      在最近的公司框架开发中,利用了网上某大牛的反射缓存库作为辅助.在测试的时候发现出现了巨大的内存泄露,在频繁的操作后,内存不断的产生巨大的开销,10多分钟就占有了5,6m的内存.解决问题的时,公司不能上网,没有内存分析工具,没有我钟爱的ANTS Memory Profiler帮助下,我们只能靠简单的内存输出来二分查找缩小范围,利用 System.Diagnostics命名空间下的Process的WorkingSet64属性来统计两次输出的内存增长量(WorkingSet64:描述关联的

JavaScript内存泄露的4种方式及如何避免

简介 内存泄露是每个开发者最终都要面对的问题,它是许多问题的根源:反应迟缓,崩溃,高延迟,以及其他应用问题. 什么是内存泄露? 本质上,内存泄露可以定义为:应用程序不再需要占用内存的时候,由于某些原因,内存没有被操作系统或可用内存池回收.编程语言管理内存的方式各不相 同.只有开发者最清楚哪些内存不需要了,操作系统可以回收.一些编程语言提供了语言特性,可以帮助开发者做此类事情.另一些则寄希望于开发者对内存是否需 要清晰明了. JavaScript 内存管理 JavaScript 是一种垃圾回收语言