6650|19

78

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

内存泄露!! [复制链接]

各位大侠,这是我写的打开位图程序,现在发现有严重的内存泄露问题,拜托大家帮忙找找原因??
是不是应该自己先建块内存,最后再把这块内存删掉??可是具体怎么实现呢??

switch(flag0)
{
case 1:
{
pathsave1=app->dao1+_T(".bmp");//获取地址
bitmap.Attach(SHLoadDIBitmap(pathsave1));
m_bitmapS.SetBitmap(bitmap);
m_bitmapS.SetBitmap(bitmap);
bitmap.Detach();
}
break;
case 2:
{
pathsave2=app->dao2+_T(".bmp");
bitmap.Attach(SHLoadDIBitmap(pathsave2));
m_bitmapS.SetBitmap(bitmap);
m_bitmapS.SetBitmap(bitmap);
bitmap.Detach();
}
break;
case 3:
{
pathsave3=app->dao3+_T(".bmp");
bitmap.Attach(SHLoadDIBitmap(pathsave3));  
m_bitmapS.SetBitmap(bitmap);
m_bitmapS.SetBitmap(bitmap);
bitmap.Detach();
}
break;
case 4:
{
pathsave4=app->dao4+_T(".bmp");
bitmap.Attach(SHLoadDIBitmap(pathsave4));  
m_bitmapS.SetBitmap(bitmap);
m_bitmapS.SetBitmap(bitmap);
bitmap.Detach();
}
break;
case 5:
{
pathsave5=app->dao5+_T(".bmp");
bitmap.Attach(SHLoadDIBitmap(pathsave5));  
m_bitmapS.SetBitmap(bitmap);
m_bitmapS.SetBitmap(bitmap);
bitmap.Detach();
}
break;
}

最新回复

我晕,有个地方没改,应该是if(load2==NULL)  详情 回复 发表于 2010-1-28 09:01
点赞 关注

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
怎么没人回复呢??拜托大家帮帮忙,分可以再加!!
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
SHLoadDIBitmap
你查看一下Windows CE的帮助文档
很明显有一句话:
The application should call the DeleteObject function when the bitmap is no longer needed.

 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
BOOL DeleteObject(
  HGDIOBJ hObject
);
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

5
 
hObject参数就是SHLoadDIBitmap函数返回的位图句柄。
先加这个。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

6
 
m_bitmapS.SetBitmap(bitmap);
是什么,为什么进行两次?

楼主为什么确定是位图的泄漏?.
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 hansin 的回复:
m_bitmapS.SetBitmap(bitmap);
是什么,为什么进行两次?

楼主为什么确定是位图的泄漏?.

猜测是他用一次的话,显示不出位图。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
我加了DeleteObject还是不行啊。
我是这样加的:
HBITMAP load1=SHLoadDIBitmap(pathsave1);
DeleteObject(load1);
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 5 楼 hansin 的回复:
m_bitmapS.SetBitmap(bitmap);
是什么,为什么进行两次?

楼主为什么确定是位图的泄漏?.


正如6楼所说,只进行一次有时候会画不出来。
我在调试的时候同时看内存,发现只要调用一次打开位图,内存就会增加将近500K,正好是一副位图的大小。这种增加只增无减,所以想着是不是内存泄露了???
 
 
 

回复

95

帖子

0

TA的资源

一粒金砂(初级)

10
 
怎么没有人回复呢??拜托大家帮忙看看啊??我实在是不会了~~
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 8 楼 muyizhaoyang 的回复:
引用 5 楼 hansin 的回复:
m_bitmapS.SetBitmap(bitmap);
是什么,为什么进行两次?

楼主为什么确定是位图的泄漏?.


正如6楼所说,只进行一次有时候会画不出来。
我在调试的时候同时看内存,发现只要调用一次打开位图,内存就会增加将近500K,正好是一副位图的大小。这种增加只增无减,所以想着是不是内存泄露了???

那不就是没有释放么?看看是不是那个地方的内存没有释放
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 7 楼 muyizhaoyang 的回复:
我加了DeleteObject还是不行啊。
我是这样加的:
HBITMAP load1=SHLoadDIBitmap(pathsave1);
DeleteObject(load1);

这个必须加。否则这个地方也会造成内存泄露。
另外除了这个地方。
肯定还存在内存泄露。
另外楼主,你用了两次SetBitmap才显示出来位图
你不觉得很玄妙吗?
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

13
 
bitmap是一个CBitmap的变量是吧。
m_bitmapS是一个控件关联的变量吧。
bitmap你释放了吗?
你bitmap.DeleteObject();了吗
楼主的代码存在很大的问题吧。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

14
 
你GDI对象都没释放
肯定内存在不断的消耗。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 12 楼 joyzml 的回复:
bitmap是一个CBitmap的变量是吧。
m_bitmapS是一个控件关联的变量吧。
bitmap你释放了吗?
你bitmap.DeleteObject();了吗
楼主的代码存在很大的问题吧。


不好意思,刚开始接触编程,就要做东西,实在是不懂~~
我现在
                           m_bitmapS.Detach();
                        bitmap.Detach();
                        bitmap.DeleteObject();
,还是不行,仍然是增加一个位图的内存。
拜托帮帮忙,再教教我,加分加分!!
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 10 楼 guopeixin 的回复:
引用 8 楼 muyizhaoyang 的回复:
引用 5 楼 hansin 的回复:
m_bitmapS.SetBitmap(bitmap);
是什么,为什么进行两次?

楼主为什么确定是位图的泄漏?.


正如6楼所说,只进行一次有时候会画不出来。
我在调试的时候同时看内存,发现只要调用一次打开位图,内存就会增加将近500K,正好是一副位图的大小。这种增加只增无减,所以想着是不是内存泄露了???

那不就是没有释放么?看看是不是那个地方的内存没有释放



是啊,现在就是找不到地方~~
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

17
 
很可能你其他地方的代码也存在内存泄露
你重新写一个简单的代码
那些switch的也不要
所有的代码都放到一个函数里
一点一点调试,直到解决掉内存泄露的问题
再去管其他的代码
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

18
 
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

19
 
问题解决,谢谢大家,尤其是joyzml!!
主要是对调用位图不熟悉,还是资源没有完全释放。
修改代码如下:
                           pathsave2=paths+_T("\\AC.bmp");
                        HBITMAP load2=SHLoadDIBitmap(pathsave2);
                        bitmap.Attach(load2);                       
                        if(!SHLoadDIBitmap(pathsave2))
                        {
                                MessageBox(_T("未找到历史记录!"));
                                bitmap.LoadBitmapW(IDB_BITMAP5);                               
                        }
                        oldBitmap=m_bitmapS.SetBitmap(bitmap);
                        oldBitmap=m_bitmapS.SetBitmap(bitmap);

                        m_bitmapS.SetBitmap(oldBitmap);
                        DeleteObject(oldBitmap);

                        bitmap.Detach();
                        bitmap.DeleteObject();
                        DeleteObject(load2);
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

20
 
我晕,有个地方没改,应该是if(load2==NULL)
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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