共有2904人关注过本帖树形打印复制链接

主题:[原创]请教下大家,我这个MFC双缓冲代码哪里存在内存泄漏?

客人
  1楼


[原创]请教下大家,我这个MFC双缓冲代码哪里存在内存泄漏?  发帖心情 Post By:2018-1-16 10:13:00 [只看该作者]

  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
  2楼 | 信息 | 搜索 | 邮箱 | 主页


加好友 发短信
等级:管理员
  发帖心情 Post By: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();


  单帖管理 | 引用 | 回复 回到顶部
客人
  3楼


  发帖心情 Post By:2018-1-16 16:57:00 [只看该作者]

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


  单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表

[原创]请教下大家,我这个MFC双缓冲代码哪里存在内存泄漏?

用户名:          
内容:
               签名