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资源,以免产生GDI资源泄漏,导致程序异常。但是没有实际的体会,在今天晚上的小组讨论会上,大家谈到了这类话题,才真实的体会到GDI资源泄漏带来的种种...
  • chenlycly
  • chenlycly
  • 2012年05月16日 22:35
  • 1370

Wince下的GDI+

早就想写博客,但是人懒,所以就一直拖下来了。我是一个编程爱好者,注意是爱好者。换句话说也就是野路子没有受过正经的科班训练,所以很多地方都有可能笑掉大牙,有错误请不吝赐教。好了,言归正传,我第一个要说的...
  • zcmky05
  • zcmky05
  • 2009年03月26日 09:58
  • 3994

Wince下的GDI+(续)

上次我试验了我的劳动成果,证明是不行的。不过这里有人给出一个可以实用的版本。我来说下我的试用成果。一、安装下载后,将文件复制到相应的文件夹中,inlcude文件我是到Windows Mobile 6 ...
  • zcmky05
  • zcmky05
  • 2009年04月03日 16:35
  • 3250

wince下GDI绘图性能测试

  • 2009年04月22日 10:06
  • 54KB
  • 下载

Wince GDI资源泄露可能原因

Wince GDI资源泄露可能原因 在网上找了很多人的博客来看,在各种论坛里面看高手的回复,把Wince GDI资源泄露的可能原因总结了一下 (1)不要用CDC做直接用HDC ...
  • joji_h
  • joji_h
  • 2014年06月06日 15:18
  • 551

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

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

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

修改一个程序的DPI问题          HDC hDC = ::GetDC(NULL); INT DPIValue =GetDeviceCaps(hDC,LOGPIXELSX); ///...
  • kaizi318
  • kaizi318
  • 2015年05月27日 14:02
  • 4359

GDI内存泄露解析

GDI内存泄露解析  (2007-03-30 17:13:03) 转载   分类: C/VC 感受了这段时间的内存泄露,终于了解了GUI的内存...
  • aristolto
  • aristolto
  • 2011年10月30日 17:39
  • 2391

定位MFC程序GDI对象泄漏过程中的一些经验

定位MFC程序GDI对象泄漏过程中的一些经验之前接触MFC比较少,最近一个程序需要使用MFC写界面。写完之后发现程序运行一段时间后异常卡顿,并且WIN7系统任务栏图标出现一些毛边等异常情况。重新运行程...
  • shuihappy1
  • shuihappy1
  • 2017年02月04日 11:06
  • 761

GDI编程需要注意的地方(句柄泄漏)

写GDI的时候,我们经常会由于粗心大意,忘记释放GDI资源,导致GDI句柄泄露。再加上如果单元测试做的不好,就会在产品发布以后发生问题。 众所周知,Windows上对于一个进程允许的最大GDI句...
  • softfox
  • softfox
  • 2013年01月27日 19:37
  • 2613
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Wince GDI资源泄露可能原因
举报原因:
原因补充:

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