内存泄露老问题 找出分数大大的有!

qq14923349 2012-03-22 09:41:55

CClientDC dc(this);

CRect rect;
dlg->GetWindowRect(&rect);
int real_x = rect.left;
int real_y = rect.top;
int real_width = rect.Width();
int real_Height = rect.Height();


CDC dcmem,dcmem2;
dcmem.CreateCompatibleDC(&dc);
dcmem2.CreateCompatibleDC(&dc);


CBitmap Bkbitmap;
Bkbitmap.LoadBitmap(IDB_strenchBK); //IDB_BlackLamp


BITMAP bmpInfo;
Bkbitmap.GetBitmap(&bmpInfo);

CBitmap* pOldBitmap = dcmem.SelectObject(&Bkbitmap);

CRect srect;
GetWindowRect(&srect);
int s_x = srect.left;
int s_y = srect.top -40;
int s_width = srect.Width();
int s_Height = srect.Height();

CBitmap Tempbmp;
Tempbmp.CreateCompatibleBitmap(&dc,srect.Width(),srect.Height() );
CBitmap *mem2oldbmp = dcmem2.SelectObject(&Tempbmp);


dcmem2.StretchBlt(0,0,srect.Width(),srect.Height(),&dcmem,0,s_y,bmpInfo.bmWidth,srect.Height(),SRCCOPY);


//----------------------
CDC dcImage, dcTrans;
dcImage.CreateCompatibleDC(&dc);
dcTrans.CreateCompatibleDC(&dc);

//装入欲显示的位图
CBitmap BlackLamp; HBITMAP hbitmap;
switch(state){
case lp_Gray:BlackLamp.LoadBitmap(IDB_BlackLamp); break;
case lp_Green:BlackLamp.LoadBitmap(IDB_GreenLamp);break;
case lp_Red:BlackLamp.LoadBitmap(IDB_RedLamp);break;

}

//取得位图的详细信息
BITMAP bm;
BlackLamp.GetBitmap(&bm);
int nWidth =bm.bmWidth;
int nHeight =bm.bmHeight;

CBitmap* pOldBitmapImage2 = dcImage.SelectObject(&BlackLamp);

// 建立与欲显示的位图等大的单色的位图,用来过滤背景色
CBitmap bitmapTrans;
//“面具”就在这步做好
bitmapTrans.CreateBitmap(nWidth, nHeight, 1, 1, NULL);

CBitmap* pOldBitmapTrans = dcTrans.SelectObject(&bitmapTrans);

//强行将欲显示的位图的背景色设为白色,以方便建立dcTrans,这步很重要。如果你的
//位图的背景色不是白色的,你只需要修改这一步的参数
dcImage.SetBkColor(RGB(255,255,255));

dcTrans.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY);
//在dcTrans中,背景色变为白色,而主要图像的各种色彩都被设成黑色

//显示“面具”,这步主要目的在于让你更能够明白“面具”的真面目
//pDC->BitBlt(0, bm.bmHeight, nWidth, nHeight, &dcTrans, 0, 0,SRCCOPY);


dcmem2.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0,SRCINVERT);
//该步将源位图与目标区域进行异或操作

dcmem2.BitBlt(0, 0, nWidth, nHeight, &dcTrans, 0, 0, SRCAND);
//通过dcTrans与目标区域进行“与”操作, 建立了与主要图像轮廓一致的黑框
//以保护图片的主要内容不会改变
dcmem2.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT);

//----------------------

dc.BitBlt(0,0,srect.Width(),srect.Height(),&dcmem2,0,0,SRCCOPY);


//////////释放

dcmem2.SelectObject(mem2oldbmp); Tempbmp.DeleteObject(); dcmem2.DeleteDC();

dcTrans.SelectObject(pOldBitmapTrans); bitmapTrans.DeleteObject(); dcTrans.DeleteDC();


dcImage.SelectObject(pOldBitmapImage2); BlackLamp.DeleteObject(); dcImage.DeleteDC();

dcmem.SelectObject(pOldBitmap); Bkbitmap.DeleteObject(); dcmem.DeleteDC();
...全文
262 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQ515311445 2012-03-27
  • 打赏
  • 举报
回复
2楼的说得很明白,我以前也碰到了,纠结了好久,用2楼的方法就行
harktrip 2012-03-26
  • 打赏
  • 举报
回复
我以前有遇到過...一模一樣的問題,我先回想看看
qq14923349 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 aaa_tnt 的回复:]

第一点说的 返回成功不代表释放资源也成功了。
第二点
DeleteDC(dcImage.m_hDC);
蛋疼的找了下链接
http://support.microsoft.com/kb/819635/zh-cn
[/Quote]

大牛继续

还是有泄漏

dcmem2.SelectObject(mem2oldbmp); ::DeleteDC(dcmem2.m_hDC);Tempbmp.DeleteObject(); //dcmem2.DeleteDC(); Tempbmp.DeleteObject();

dcTrans.SelectObject(pOldDcTrans); ::DeleteDC(dcTrans.m_hDC);bmDcTrans.DeleteObject(); //dcTrans.DeleteDC(); bmDcTrans.DeleteObject();


dcImage.SelectObject(pOldDcImage); ::DeleteDC(dcImage.m_hDC);BlackLamp.DeleteObject(); //dcImage.DeleteDC(); BlackLamp.DeleteObject();

dcmem.SelectObject(pOldBitmap); ::DeleteDC(dcmem.m_hDC); Bkbitmap.DeleteObject(); //dcmem.DeleteDC(); Bkbitmap.DeleteObject();
qq14923349 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 aaa_tnt 的回复:]

第一点说的 返回成功不代表释放资源也成功了。
第二点
DeleteDC(dcImage.m_hDC);
蛋疼的找了下链接
http://support.microsoft.com/kb/819635/zh-cn
[/Quote]

第二点
问题我没用到
GetDC ();
ReleaseDC

这两个神器啊
Ei 2012-03-22
  • 打赏
  • 举报
回复
第一点说的 返回成功不代表释放资源也成功了。
第二点
DeleteDC(dcImage.m_hDC);
蛋疼的找了下链接
http://support.microsoft.com/kb/819635/zh-cn
qq14923349 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 aaa_tnt 的回复:]

1.把hBmp 释放与 DC释放 顺序调换。因为你先释放bitmap的时候 ,可能是不成功的,因为你的bmp还在DC内存里面,处于被占用状态。
2.释放时候使用Win32API 释放HDC,不要用CDC对象。这个是老问题了,wince的GDI内存泄漏bug。
[/Quote]

你说的第二条什么意思啊

但是我理解是GetDC ReleaseDC才用WINAPI操作释放吧
在CDC对象下不会出现该BUG吧??
请指教
qq14923349 2012-03-22
  • 打赏
  • 举报
回复
2.释放时候使用Win32API 释放HDC,不要用CDC对象。这个是老问题了,wince的GDI内存泄漏bug。


什么意思?
我是CDC 对象啊 不是指针
qq14923349 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 aaa_tnt 的回复:]

1.把hBmp 释放与 DC释放 顺序调换。因为你先释放bitmap的时候 ,可能是不成功的,因为你的bmp还在DC内存里面,处于被占用状态。
2.释放时候使用Win32API 释放HDC,不要用CDC对象。这个是老问题了,wince的GDI内存泄漏bug。
[/Quote]

1Tempbmp.DeleteObject(); dcmem2.DeleteDC();
改为
dcmem2.DeleteDC(); Tempbmp.DeleteObject(); 这种?

这个我试过了 没问题 我都用代码测试过返回值了

具体:
dcmem.SelectObject(pOldBitmap);
if(Bkbitmap.DeleteObject() ==0) AfxMessageBox(L"Bkbitmap!"); if(dcmem.DeleteDC()==0) AfxMessageBox(L"dcmem!");
dcmem2.SelectObject(mem2oldbmp);
if(Tempbmp.DeleteObject() ==0) AfxMessageBox(L"DeleteObject!"); if(dcmem2.DeleteDC()==0) AfxMessageBox(L"dcmem2!");

dcTrans.SelectObject(pOldBitmapTrans);
if(bitmapTrans.DeleteObject() ==0) AfxMessageBox(L"bitmapTrans!"); if(dcTrans.DeleteDC()==0) AfxMessageBox(L"dcTrans!");

dcImage.SelectObject(pOldBitmapImage2);
if(BlackLamp.DeleteObject() ==0) AfxMessageBox(L"BlackLamp!"); if(dcImage.DeleteDC()==0) AfxMessageBox(L"dcImage!");




Ei 2012-03-22
  • 打赏
  • 举报
回复
1.把hBmp 释放与 DC释放 顺序调换。因为你先释放bitmap的时候 ,可能是不成功的,因为你的bmp还在DC内存里面,处于被占用状态。
2.释放时候使用Win32API 释放HDC,不要用CDC对象。这个是老问题了,wince的GDI内存泄漏bug。
qq14923349 2012-03-22
  • 打赏
  • 举报
回复
100分的命题 没人来?大可以复制到CE下看看 我看的时候是4K 稳定增长 这是三态灯代码

19,498

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧