Wince GDI资源泄露可能原因

原创 2012年03月31日 16:39:03
Wince GDI资源泄露可能原因

在网上找了很多人的博客来看,在各种论坛里面看高手的回复,把Wince GDI资源泄露的可能原因总结了一下
(1)不要用CDC做直接用HDC
(2)OnEraseBkgnd擦除背景函数没用,只有一句return true;,所以把Invalidate();改成Invalidate(0);
(3)    BUG: Memory leaks when you use the CWnd class versions of the GetDC method and the ReleaseDC method
    When you run code that calls the CWnd::GetDC function followed by the CWnd::ReleaseDC function, a memory leak of 4 bytes occurs. The cause of this bug is currently unknown. To avoid this problem, do not use the CWnd class versions of the GetDC method and the ReleaseDC method. Use the GetDC function and the ReleaseDC function. Microsoft has confirmed that this is a bug in the Microsoft products that are listed at the beginning of this article.
    Steps to Reproduce the Behavior
In a method that is a part of a class that is derived from CWnd, insert the following code in your application:
  1. CDC *pDC;  
  2. RECT rect;  
  3.   
  4. GetClientRect (&rect);  
  5.   
  6. for (int i = 0; i < 1000; i++)  
  7. {  
  8.     pDC = GetDC ();  
  9.     ReleaseDC (pDC);  
  10. }  

    If you run this code and then check the system memory before and after you run the code, you notice that the system memory leaks four bytes per iteration. If you change the code to the following code, the memory leak does not occur:
 HDC hDC;
  1. RECT rect;  
  2. ::GetClientRect (m_hWnd, &rect);  
  3.   
  4. for (int i = 0; i < 1000; i++)  
  5. {  
  6.     hDC = ::GetDC (m_hWnd);  
  7.     ::DrawText (hDC, L"Testing...", 10, &rect, DT_CENTER);  
  8.     ::ReleaseDC (m_hWnd, hDC);  
  9. }  
(4) 如果过于频繁的使用CreateCompatibleDC这种的话可以改为成员变量,在析构函数中释放。
(5) 创建的Gdiobj如果执行了selectobject,一般要这样删除,例如pOldFont=selectobject(&m_fontSongTi);在删除时要先pDC->SelectObject(pOldFont);再删除GDI资源,m_fontSongTi.deleteobject(); 

附:GDI使用的几个注意点:

1、Create出来的GDI对象,要用Deleteobject释放, create出来的DC,要用DeleteDc释放,getDC得出的DC,用ReleaseDc释放。

2、先create后delete, create1,create2, delete2,delete1的顺序。

3、画图步骤

a 创建一个内存兼容dc(CreateCompatibleDC)
b.创建一个内存兼容bitmap(CreateCompatibleBitmap)
c.关联创建的内存兼容dc和bitmap(SelectObject)
d.画图
e.BitBlt到目的dc上
f.断开内存兼容dc和bitmap关联(SelectObject)
g.销毁内存兼容bitmap
h.销毁内存兼容dc


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

GDI对象猛增,GDI资源泄漏的问题

修改一个程序的DPI问题          HDC hDC = ::GetDC(NULL); INT DPIValue =GetDeviceCaps(hDC,LOGPIXELSX); ///...

在 WINCE 开发中使用 GDI 绘图时,碰到的内存泄露问题

大白天的见活鬼,十分的无语: 在一个 CDialog 中写了个 Timer ,Timer中有一段用 GDI 绘图的代码如下: void WaveDlg::OnTimer(UINT_PTR ...
  • joji_h
  • joji_h
  • 2014年06月06日 15:25
  • 693

GDI对象的使用和防止资源泄露

最近的项目在绘制大量采集到的数据时,会有内存泄露的致程序崩溃的情况,反复推测后可能是GDI对象的释放问题,现在网上搜取如下经验,应该很有帮助GDI对象的使用和防止资源泄露在windows系列上做编程,...

如何防止GDI资源泄露

在windows系列上做编程,gdi是一个很重要的技术点,有很多程序在运行多次后出现异常,除了众所周知的内存泄露以外,gdi资源泄露也是一个很直接的原因.今天就把我自己在编程中总结的一些经验给大家分享...
  • weiqubo
  • weiqubo
  • 2011年09月28日 16:58
  • 1299

gdi编程中的资源泄露

在windows系列上做编程,gdi是一个很重要的技术点,有很多程序在运行多次后出现异常,除了众所周知的内存泄露以外,gdi资源泄露也是一个很直接的原因.今天就把我自己在编程中总结的一些经验给大家分享...

Net资源泄露(内存泄露,GDI泄露,handle 泄露等)的终极解决方案

http://blog.csdn.net/yuanhuiqiao/article/details/5264480 摘要   本文主要讨论了,什么是.Net内存泄露?如何确定是发生了...

WinCE启动时频繁死机的原因分析

  • 2010年03月10日 19:11
  • 49KB
  • 下载

wince 应用程序崩溃原因分析data abort----通过产生MAP和COD文件的方式

原文地址::http://justtotry.blog.163.com/blog/static/44630812201171510614697/ VS2005使用map文件查找程序崩溃原因 ...

WinCE启动失败的原因与解决办法分析

本文通过一个真实的嵌入式项目进行说明。文中的嵌入式系统用的是arm处理器+WinCE平台,项目的目的是要把WinCE平台从旧版本移植到WinCE6.0平台上。但结果是这个WinCE系统在启动的时候经常...

WinCE系统下应用崩溃原因的分析方法

做为程序员,最怕什么?Bug?大家都清楚,调试期的 Bug 并不可怕,那怕是那些神龙见首不见尾的 INT(随机、没有规律) Bug。 做为嵌入式程序员,也是一样的。一般来说嵌入式系统都提供了异常分析...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Wince GDI资源泄露可能原因
举报原因:
原因补充:

(最多只允许输入30个字)