以文本方式查看主题

-  公司论坛  (https://emtronix.com/club/index.asp)
--  技术问答  (https://emtronix.com/club/list.asp?boardid=1)
----  [原创]请教下大家,我这个MFC双缓冲代码哪里存在内存泄漏?  (https://emtronix.com/club/dispbbs.asp?boardid=1&id=4773)

--  作者:客人
--  发布时间:2018-1-16 10:13:00
--  [原创]请教下大家,我这个MFC双缓冲代码哪里存在内存泄漏?

  CRect rc;

  CDC memDC;   

  CBitmap bmp; //内存中承载临时图象的位图

  CDC* pDC = GetDC();

  

  memDC.CreateCompatibleDC(pDC);           //创建与目标DC相兼容的内存DC

  if((Uartled_flag==0)&&(Uartled_flag2==0x5555))

  {

  bmp.LoadBitmap(IDB_BITMAP_Green_Led);

  memDC.SelectObject(&bmp);//把位图选入内存DC

  pDC->BitBlt(710,546,32,32,&memDC, 0, 0,SRCCOPY);// BitBlt绘图函数

  bmp.DeleteObject();

  }

  else if((Uartled_flag==1)&&(Uartled_flag2==0x5555))

  {

  bmp.LoadBitmap(IDB_BITMAP_BLACK); //

  memDC.SelectObject(&bmp);//把位图选入内存DC

  pDC->BitBlt(710,546,32,32,&memDC, 0, 0,SRCCOPY);// BitBlt绘图函数

  bmp.DeleteObject();

  }

  else

  {

   bmp.LoadBitmap(IDB_BITMAP_RED_LED);

   memDC.SelectObject(&bmp);//把位图选入内存DC

   pDC->BitBlt(710,546,32,32,&memDC, 0, 0,SRCCOPY);// BitBlt绘图函数

   bmp.DeleteObject();

  }

  //com2画一个红色的圆

  bmp.LoadBitmap(IDB_BITMAP_RED_LED);

  memDC.SelectObject(&bmp);//把位图选入内存DC

  pDC->BitBlt(710,570,32,32,&memDC, 0, 0,SRCCOPY);// BitBlt绘图函数

  bmp.DeleteObject();


  memDC.DeleteDC();

  ReleaseDC(pDC);



--  作者:yy
--  发布时间:2018-1-16 14:25:00
--  

你检查下你DeleteObject返回是不是0,如果是0则表示对象删除失败。

你查下MSDN,当CBitmap的对象被DC加载的时候应该是删除不了对象的。

所以当DC做SelectObject的时候,你应该保留返回的old对象,并且在使用完成后,重新调用SelectObject恢复原对象。

例如:

CBitmap* pOldBmp = memDC.SelectObject( &bmp );    //把位图选入内存DC,并保存原对象。

....        //若干操作

memDC.SelectObject( pOldBmp);         //还原

bmp.DeleteObject();


--  作者:客人
--  发布时间:2018-1-16 16:57:00
--  

谢谢,谢谢,不胜感激,确实如您所说的那样,我修改程序后就好了