Wince GDI资源泄露可能原因

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


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aristolto/article/details/7416302
个人分类: MFC& 界面
上一篇关于在WinCE下使用SetWindowRgn的问题
下一篇API 绘图
想对作者说点什么? 我来说一句

GDI泄露检测工具

2012年10月23日 99KB 下载

GDI泄露动态检查工具

2008年11月11日 41KB 下载

uilib gdi泄漏bug修复

2014年08月12日 11KB 下载

c++ gdi泄露检测工具 GDIndicator-GDI

2015年03月19日 695KB 下载

GDI检测工具.rar

2014年05月28日 105KB 下载

检测gdi泄漏工具(x64)

2014年04月17日 61KB 下载

GDIndicator-GDI泄露测试工具

2011年06月10日 7.29MB 下载

GDIndicator-GDI泄露检测

2018年02月08日 1.97MB 下载

没有更多推荐了,返回首页

关闭
关闭