关于操作DC时的资源泄露
首先应明确一个概念 句柄, 关于句柄的详细介绍请见这里
对于句柄的使用小结:借来的要归还,创建的要释放,选出的要选入【尤其是针对GDI的一些句柄而言,如HPEN,HBRUSH等】
1. 使用GetDC() 获取的设备上下文指针在不使用的时候必须调用ReleaseDC()进行释放
例如:
CDC *pDC = GetDlgItem(IDC_TEST)->GetDC(); /*...............*/ GetDlgItem(IDC_TEST)->ReleaseDC(pDC);
2. 在创建了DC或其他GDI资源后,如果不再使用则需要将所创建的资源进行释放
例如:
CDC dcMem; dcMem.CreateCompatibleDC(NULL); /*..............*/ dcMem.DeleteDC();
3. 在将创建的GDI绘图对象选入了设备上下文后,如果使用完毕则需要将之前选出的旧有的GDI绘图对象选入,然后在删除所创建的GDI对象
例如:
CBitmap bmp; bmp.CreateCompatibleBitmap(pDC, nWidht, nHeight); CBitmap *pBmpOld = memDC.SelectObject(&bmp); /*..................................*/ memDC.SelectObject(pBmpOld); bmp.DeleteObject();
说明:一定要注意SelectObject的操作通常要成对出现,否则可能会导致GDI资源泄露。例如上面的例子,如果在最后我们没有执行语句
memDC.SelectObject(pBmpOld);只是调用了bmp.DeleteObject(),此时对于bmp资源的释放是失败的,即无法将之前所创建的位图图像删除。
Attach 的需要Detach
例如:
CImage img; if (SUCCEEDED(img.Load(strFileName))) { HBITMAP hBitmap = img.Detach(); /*......................*/ img.Attach(hBitmap); } img.Destroy();
bitmap = CreateCompatibleBitmap(...); HBITMAP oldbitmap = SelectObject(hdc, bitmap); ... SelectObject(hdc, oldbitmap); DeleteObject(&bitmap)
关于操作DC时的资源泄露的更多相关文章
- webview加载h5,关闭activity时,窗体泄露问题
问题描述: webview加载一个含有input控件的html页面,当点击input控件是回调app的closepage方法[closepage中只有一个finish操作],出现窗体泄露问题. 分析: ...
- Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源
Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源 在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.今天就给大家介绍一个 Spri ...
- .NET资源泄露与处理方案
.NET虽然拥有强大易用的垃圾回收机制,但并不是因为这样,你就可以对资源管理放任不管,其实在稍不注意的时候,可能就造成了资源泄露,甚至因此导致系统崩溃,到那时再来排查问题就已经是困难重重. 一.知识点 ...
- PySpark操作HBase时设置scan参数
在用PySpark操作HBase时默认是scan操作,通常情况下我们希望加上rowkey指定范围,即只获取一部分数据参加运算.翻遍了spark的python相关文档,搜遍了google和stackov ...
- thinkphp使用模块/控制器/操作访问时出现No input file specified.解决方式
thinkphp使用 http://serverName/index.php/模块/控制器/操作 访问时,出现了 No input file specified. 的错误 解决办法: 一: 开启cgi ...
- .net操作PDF的一些资源(downmoon收集)
因为业务需要,搜集了一些.net操作pdf的一些资源,特在此分享. 1.如何从 Adobe 可移植文档格式 (PDF) 文件中复制文本和图形 http://support.microsoft.com/ ...
- 使用固件库操作STM32F4时的必要配置(转)
源:使用固件库操作STM32F4时的必要配置 使用STM32F4的固件库时,默认的晶振为25Mhz晶振,因此需要做一定的修改.之前因为一直没有注意这个问题,我捣腾了许久,发现工作时钟总是不对,查阅了一 ...
- Kafka中操作topic时 Error:Failed to parse the broker info from zookeeper
Kafka中操作topic时 Error: Failed to parse the broker info from zookeeper 1.问题描述 2.问题原因 kafka在启动后 ...
- 使用SQL Server Management Studio操作replication时,要用机器名登录,不要用IP地址
如果你在使用SSMS(SQL Server Management Studio)登录SQL Server时,使用的是IP地址,如下图所示: 当你操作replication时,会报错: 从上面的错误提示 ...
随机推荐
- Maven内置隐式变量
Maven提供了三个隐式的变量可以用来访问环境变量,POM信息,和Maven Settings env env变量,暴露了你操作系统或者shell的环境变量.便 如在Maven POM中一个对${en ...
- 转:eclipse载入extjs4出现内存溢出错误的解决方法
去掉.project文件中的以下部分:第一部分:<buildCommand> <name>org.eclipse.wst.jsdt.core.javascriptVali ...
- 【Maven实战】Maven开发环境的搭建和案例展示
1.首先到www.apache.org中下载maven,得到一个apache-maven-3.1.0-bin.zip的压缩包. 2.将此压缩包解压,这里解压到D:\docs中,然后找到maven的bi ...
- poj A Round Peg in a Ground Hole
http://poj.org/problem?id=1584 #include<cstdio> #include<cstring> #include<cmath> ...
- C#程序设计基础——转义字符
\’ 单引号 \” 双引号 \\ 反斜杠 \0 空字符 \a 感叹号 \b 退格 \f 换页 \n 换行 \r 回车 \t 水平Tab \v 垂直Tab
- ISO7816协议的块传输协议
1.块传输协议中的前三个字节是强制必须有的 NAD节点地址: 当终端支持多个卡槽,终端和这些卡槽以总线的方式通讯时,该字节有用,其他情况下,默认为0 bit1-3:定义了源地址 bit5-7:定义了目 ...
- C51指针的使用
指针就是指变量或数据所在的存储区地址.如一个字符型的变量 STR 存放在内存单元DATA 区的 51H 这个地址中,那么 DATA 区的 51H 地址就是变量 STR 的指针.在 C 语言中指针是一个 ...
- filter高级应用
Filter高级应用: Decorator模式 1)包装类需要和被包装对象 实现相同接口,或者继承相同父类 2)包装类需要持有 被包装对象的引用 在包装类中定义成员变量,通过包装类构造方法,传入 ...
- objc_msgSend iOS8 EXC_BAD_ACCESS
如果方法是没有返回值的,需要强转一个返回类型为void的临时函数指针, void (*objc_msgSendTyped)(id self, SEL _cmd, id obj, id arg1) = ...
- B - The Accomodation of Students - hdu 2444(最大匹配)
题意:现在有一些学生给你一下朋友关系(不遵守朋友的朋友也是朋友),先确认能不能把这些人分成两组(组内的人要相互不认识),不能分的话输出No(小写的‘o’ - -,写成了大写的WA一次),能分的话,在求 ...