各位大侠,这是我写的打开位图程序,现在发现有严重的内存泄露问题,拜托大家帮忙找找原因??
是不是应该自己先建块内存,最后再把这块内存删掉??可是具体怎么实现呢??
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;
}
SHLoadDIBitmap
你查看一下Windows CE的帮助文档
很明显有一句话:
The application should call the DeleteObject function when the bitmap is no longer needed.
BOOL DeleteObject(
HGDIOBJ hObject
);
hObject参数就是SHLoadDIBitmap函数返回的位图句柄。
先加这个。
m_bitmapS.SetBitmap(bitmap);
是什么,为什么进行两次?
楼主为什么确定是位图的泄漏?.
引用: 引用 5 楼 hansin 的回复:
m_bitmapS.SetBitmap(bitmap);
是什么,为什么进行两次?
楼主为什么确定是位图的泄漏?.
猜测是他用一次的话,显示不出位图。
我加了DeleteObject还是不行啊。
我是这样加的:
HBITMAP load1=SHLoadDIBitmap(pathsave1);
DeleteObject(load1);
引用: 引用 5 楼 hansin 的回复:
m_bitmapS.SetBitmap(bitmap);
是什么,为什么进行两次?
楼主为什么确定是位图的泄漏?.
正如6楼所说,只进行一次有时候会画不出来。
我在调试的时候同时看内存,发现只要调用一次打开位图,内存就会增加将近500K,正好是一副位图的大小。这种增加只增无减,所以想着是不是内存泄露了???
怎么没有人回复呢??拜托大家帮忙看看啊??我实在是不会了~~
引用: 引用 8 楼 muyizhaoyang 的回复:
引用 5 楼 hansin 的回复:
m_bitmapS.SetBitmap(bitmap);
是什么,为什么进行两次?
楼主为什么确定是位图的泄漏?.
正如6楼所说,只进行一次有时候会画不出来。
我在调试的时候同时看内存,发现只要调用一次打开位图,内存就会增加将近500K,正好是一副位图的大小。这种增加只增无减,所以想着是不是内存泄露了???
那不就是没有释放么?看看是不是那个地方的内存没有释放
引用: 引用 7 楼 muyizhaoyang 的回复:
我加了DeleteObject还是不行啊。
我是这样加的:
HBITMAP load1=SHLoadDIBitmap(pathsave1);
DeleteObject(load1);
这个必须加。否则这个地方也会造成内存泄露。
另外除了这个地方。
肯定还存在内存泄露。
另外楼主,你用了两次SetBitmap才显示出来位图
你不觉得很玄妙吗?
bitmap是一个CBitmap的变量是吧。
m_bitmapS是一个控件关联的变量吧。
bitmap你释放了吗?
你bitmap.DeleteObject();了吗
楼主的代码存在很大的问题吧。
引用: 引用 12 楼 joyzml 的回复:
bitmap是一个CBitmap的变量是吧。
m_bitmapS是一个控件关联的变量吧。
bitmap你释放了吗?
你bitmap.DeleteObject();了吗
楼主的代码存在很大的问题吧。
不好意思,刚开始接触编程,就要做东西,实在是不懂~~
我现在
m_bitmapS.Detach();
bitmap.Detach();
bitmap.DeleteObject();
,还是不行,仍然是增加一个位图的内存。
拜托帮帮忙,再教教我,加分加分!!
引用: 引用 10 楼 guopeixin 的回复:
引用 8 楼 muyizhaoyang 的回复:
引用 5 楼 hansin 的回复:
m_bitmapS.SetBitmap(bitmap);
是什么,为什么进行两次?
楼主为什么确定是位图的泄漏?.
正如6楼所说,只进行一次有时候会画不出来。
我在调试的时候同时看内存,发现只要调用一次打开位图,内存就会增加将近500K,正好是一副位图的大小。这种增加只增无减,所以想着是不是内存泄露了???
那不就是没有释放么?看看是不是那个地方的内存没有释放
是啊,现在就是找不到地方~~
很可能你其他地方的代码也存在内存泄露
你重新写一个简单的代码
那些switch的也不要
所有的代码都放到一个函数里
一点一点调试,直到解决掉内存泄露的问题
再去管其他的代码
问题解决,谢谢大家,尤其是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);
我晕,有个地方没改,应该是if(load2==NULL)