GDI对象导致内存泄露

最近在一个项目中,被测试组人员检测出来GDI对象导致内存泄露,之后,经过代码的走读,确实发现存在这样一个问题。

首先是现象,在一些项目中,如果发现图片,图标等突然显示不出来,就有可能是GDI对象已经满了,这个事情,用任务管理器,把GDI对象打开,就可以看到了,如果GDI对象迅速上涨,就基本可以确认是GDI对象导致内存泄露。

经过查证,发现以下代码会导致GDI对象上涨,内存泄露,因为以下代码会定时执行,每当一个执行周期一道,就会重新申请内存,导致泄露。

m_switch_http.SetIcon((HICON__*)::LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_OFF), 
        IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR));

正确的修改方法应该改为:

// 加载代码在初始化的时候完成,不能放在定时器里面
HICON h_off = (HICON__*)::LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_OFF), 
        IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
 
// 以下代码放在定时器里面执行
m_switch_http.SetIcon(h_off);

时间: 2024-08-30 14:19:34

GDI对象导致内存泄露的相关文章

关于Android聊天界面中用使用adapter导致内存泄露的问题,目前不知道如何改善,大神帮忙看看

问题描述 关于Android聊天界面中用使用adapter导致内存泄露的问题,目前不知道如何改善,大神帮忙看看 之前一段时间使用一段时间老是导致内存升高,而且内存也不回收,一步一步的排除了很多地方, 到最后发现问题是出在adapter中,但是也不知道怎么改了. 大神帮看看哪些地方会导致内存泄露! public void setmList(List mList) { if (isgroup) { isDiaplayNickName = SharePreferenceUtil.get_Boolean

WebBrowser控件不断操作页面导致内存泄露

问题描述 WebBrowser控件不断操作页面导致内存泄露 WebBrowser控件不断操作页面导致内存泄露,这个问题看到很多人提出来,竟然没有一个搞定的! 高手都去哪了,我也遇到这个问题 解决方案 会不会是控件本身问题 webbrowser只能做一些简单的东西

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

打开任务管理器,点击菜单"查看"--"选择列",勾上所有项,"确定".运行自己的程序,进行各种操作,并查看任务管理器中GDI对象和句柄数的变化.         如果在某次可逆操作中,例如,弹出一个对话框,然后关闭,GDI对象或句柄数先增加了,然后减少了,但是总量还是增加了,说明存在内存泄露,GDI对象没有被及时回收.如果句柄数出现类似情况,则情况复杂很多.         接下来,注释掉某些代码,编译运行并继续观察,逐步定位导致内存泄露的代码段

Python中由于logging模块误用导致的内存泄露的解决方法

  Python中由于logging模块误用导致的内存泄露的解决方法         这篇文章主要介绍了解决Python中由于logging模块误用导致的内存泄露,针对由于过多的UDP连接所产生的问题,需要的朋友可以参考下 首先介绍下怎么发现的吧, 线上的项目日志是通过 logging 模块打到 syslog 里, 跑了一段时间后发现 syslog 的 UDP 连接超过了 8W, 没错是 8 W. 主要是 logging 模块用的不对 我们之前有这么一个需求, 就是针对每一个连接日志输出当前连接

解决Python中由于logging模块误用导致的内存泄露_python

首先介绍下怎么发现的吧, 线上的项目日志是通过 logging 模块打到 syslog 里, 跑了一段时间后发现 syslog 的 UDP 连接超过了 8W, 没错是 8 W. 主要是 logging 模块用的不对 我们之前有这么一个需求, 就是针对每一个连接日志输出当前连接的信息, 所以每一个 连接就创建了一个日志实例, 并分配一个 Formatter, 创建日志实例为了区分其他连接 所以我就简单粗暴的用了当前对象的 id 来作为日志名称: import logging class Conne

android开发中的java内存泄露分析

做了较长时间的android开发了,发现其实android应用开发入门容易,但是进阶或者成为高级工程师,需要具备的基础能力还是非常高的:性能优化.内存泄露.apk瘦身.热修复等等,这些都非常的考验一个人的能力.android成长之路还很长,自己会持续的走下去.本文主要介绍android内存泄露方面的知识.其实要真的理解内存泄露,需要对JVM.java语言有一定的了解,在这个基础上就比较容易理解本文了. 一.内存泄露概念 在java中,如果一个对象没有可用价值了,但又被其他引用所指向,那么这个对象

浏览器中的内存泄露

什么是内存泄露 内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束.在C++中,因为是手动管理内存,内存泄露是经常出现的事情.而现在流行的C#和Java等语言采用了自动垃圾回收方法管理内存,正常使用的情况下几乎不会发生内存泄露.浏览器中也是采用自动垃圾回收方法管理内存,但由于浏览器垃圾回收方法有bug,会产生内存泄露. 内存泄露Quick View 不同的浏览器中存在各种内存泄露方式,目前发现的主要是这样几种: 1.循环引用 已经确认存在泄漏的浏览器:IE6.0 FF2.0

Flex应用内存泄露的分析与诊断

引言 Flex 采用 ActionScript 语言作为脚本语言,编译后的二进制代码在 FlashPlayer 虚拟机 AVM(Actionscript Virtual Machine)中运行.和 Java 语言类似, AVM 中也有一个垃圾收集器(Garbage Collection),对于不用的对象,隔一段时间会进行 收集并销毁,释放内存.和 C++ 语言相比,程序员不需要时刻关注内存的分配和释放,大大 减轻了负担.但是垃圾收集器不能从根本上解决 Flex 内存泄露的问题,这得从 Flash

Android内存泄露总结(附内存检测工具)

Java 中的内存分配 主要是分三块: 静态储存区:编译时就分配好,在程序整个运行期间都存在.它主要存放静态数据和常量. 栈区:当方法执行时,会在栈区内存中创建方法体内部的局部变量,方法结束后自动释放内存. 堆区:通常存放 new 出来的对象.由 Java 垃圾回收器回收. 栈与堆的区别 栈内存用来存放局部变量和函数参数等.它是先进后出的队列,进出一一对应,不产生碎片,运行效率稳定高.当超过变量的作用域后,该变量也就无效了,分配给它的内存空间也将被释放掉,该内存空间可以被重新使用. 堆内存用于存