7233|19

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

HDC泄露问题 [复制链接]

大家好,小弟最近在WINCE上开发了一个俄罗斯方块,但运行到一段时间后,方块就不会下落了。经过DEBUG知道,其实程序还是正常运行的,只是图片不再更新了。我用的是bitblt函数去贴图,所以也申请了几个HDC,用完后也删除了。初步估计是这个HDC泄露,但不知道如何解决。
估计也是下面的函数出错:
void RefreshBrickClient(HDC hdc)
{
int i;
RECT brickClient;
RECT rcClient;
GetClientRect(g_hWnd,&rcClient);
HDC hdcBackGround=CreateCompatibleDC(hdc);
HBITMAP hbmBackGround=CreateCompatibleBitmap(hdc,rcClient.right,rcClient.bottom);
HBITMAP hbmOldBackGround=(HBITMAP)SelectObject(hdcBackGround,hbmBackGround);
BitBlt(hdcBackGround,0,0,rcClient.right,rcClient.right,hdc,0,0,SRCCOPY);
HDC hdcBackmap=CreateCompatibleDC(hdc);
BITMAP bm;
GetObject(g_hbmBrick,sizeof(bm),&bm);
HBITMAP hbmBackmap=CreateCompatibleBitmap(hdcBackmap,bm.bmWidth,bm.bmHeight);
HBITMAP hbmOldBackmap=(HBITMAP)SelectObject(hdcBackmap,hbmBackmap);
brickClient.top=brickClient.left=0;
brickClient.bottom=bm.bmHeight;
brickClient.right=bm.bmWidth;
FillRect(hdcBackmap, &brickClient, NULL);
HDC hdcWihtemap=CreateCompatibleDC(hdc);
HBITMAP hbmWihtemap=CreateCompatibleBitmap(hdcWihtemap,bm.bmWidth,bm.bmHeight);
HBITMAP hbmOldWihtemap=(HBITMAP)SelectObject(hdcWihtemap,hbmWihtemap);
FillRect(hdcWihtemap, &brickClient, (HBRUSH)GetStockObject(WHITE_BRUSH));

HDC hdcBrick=CreateCompatibleDC(hdc);
HBITMAP hbmBrick=(HBITMAP)SelectObject(hdcBrick,g_hbmBrick);
if(!BrickAtBottom)
for(i=0;i<4;i++)
{
if(LastPositionOfBrick.y!=-1)
{
BitBlt(hdcBackGround,LEFTMARGIN+bm.bmWidth*LastPositionOfBrick.x,
TOPMARGIN+bm.bmHeight*LastPositionOfBrick.y,bm.bmWidth,bm.bmHeight,hdcBackmap,0,0,SRCAND);
BitBlt(hdcBackGround,LEFTMARGIN+bm.bmWidth*LastPositionOfBrick.x,
TOPMARGIN+bm.bmHeight*LastPositionOfBrick.y,bm.bmWidth,bm.bmHeight,hdcWihtemap,0,0,SRCPAINT);
}
}
for(i=0;i<4;i++)//重绘正在下落的方块
{
if(CurrentBrick.y!=-1)BitBlt(hdcBackGround,LEFTMARGIN+bm.bmWidth*CurrentBrick.x,
TOPMARGIN+bm.bmHeight*CurrentBrick.y,bm.bmWidth,bm.bmHeight,hdcBrick,0,0,SRCAND);
}

BitBlt(hdc,0,0,rcClient.right,rcClient.bottom,hdcBackGround,0,0,SRCCOPY);
SelectObject(hdcBackGround,hbmOldBackGround);
DeleteDC(hdcBackGround);
SelectObject(hdcBackmap,hbmOldBackmap);
DeleteDC(hdcBackmap);
SelectObject(hdcWihtemap,hbmOldWihtemap);
DeleteDC(hdcWihtemap);
SelectObject(hdcBrick,hbmBrick);
DeleteDC(hdcBrick);
}

最新回复

哈哈,人品爆发了,神都挡不住!等于白赚了好几千RMB呀,嘿嘿…  详情 回复 发表于 2010-1-30 10:33
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
帮顶下。

MARK,学习下、
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
建议使用内存泄露的工具来进行分析,
一般系统的DC是需要释放的,Release的
 
 
 

回复
vwxy500 该用户已被删除
4
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

5
 
最好检测一下 是不是确实GDI泄漏了才好作出处理
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

6
 
邦顶一下。

查泄漏比较烦.
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
SelectObject(hdcBackGround,hbmOldBackGround);
DeleteDC(hdcBackGround);
SelectObject(hdcBackmap,hbmOldBackmap);
DeleteDC(hdcBackmap);
SelectObject(hdcWihtemap,hbmOldWihtemap);
DeleteDC(hdcWihtemap);
SelectObject(hdcBrick,hbmBrick);
DeleteDC(hdcBrick);

类似这些不是都有返回值的嘛,你定义一个变量,把这些返回值看看,也许有帮助,还有 GetLasterror
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

8
 
HDC 没有泄露, HBITMAP 貌似泄露了,看你创建那么多,一个删除的都没有
DelectObject(HBITMAP); 也是需要的
当然oldbitmap是不需要删除的
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
三点意见:
第一,每次申请/分配之后,检查是否成功。你的代码里面都没有这些应有的防御措施;
第二,位图也是需要释放的,你release了dc但是位图没有释放
第三,CreateCompatiableBitmap使用的是核心内存,这个函数存在了失败的可能性,建议使用CreateDIBSection代替之。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
有几个DC类会造成4B的泄露。。。
另外,他可能并不是没有释放,只是由于内存管理的原因,造成你看不到他直接释放。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
MARK.用空了在2440下也移植一个俄罗斯方块玩玩。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 8 楼 codewarrior 的回复:
三点意见:
第一,每次申请/分配之后,检查是否成功。你的代码里面都没有这些应有的防御措施;
第二,位图也是需要释放的,你release了dc但是位图没有释放
第三,CreateCompatiableBitmap使用的是核心内存,这个函数存在了失败的可能性,建议使用CreateDIBSection代替之。
学习了…
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

13
 
使用内存检测工具 codesnitch
        http://download.pudn.com/downloads157/sourcecode/windows/other/89346494WinCEmemorytesttool.rar
         
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
具可靠消息说,那个CodeSnitch破解时很费劲,有可能还要看人品,楼主如果试用,要努力哦!Go On!
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 7 楼 reallyu 的回复:
HDC 没有泄露, HBITMAP 貌似泄露了,看你创建那么多,一个删除的都没有
DelectObject(HBITMAP); 也是需要的
当然oldbitmap是不需要删除的


正解,其他的可以54
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
帮顶。。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

17
 
创建和删除都要成对出现才行
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

18
 
这个问题我碰到过,这是因为创建兼容位图的原因。在WinCE中一般不要创建多个兼容位图,否则很容易出现内存泄露,从而出现莫名其妙的问题
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用 13 楼 wolfmvp 的回复:
具可靠消息说,那个CodeSnitch破解时很费劲,有可能还要看人品,楼主如果试用,要努力哦!Go On!


嘿嘿,正是如此,确实很费力,不过通过我不懈的努力终于破解了
人品爆发了,这个工具确实相当不错,
正规购买好象要500美圆/年
 
 
 

回复

1

帖子

0

TA的资源

禁止访问

20
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条
电源解决方案和技术 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表