以文本方式查看主题 - 公司论坛 (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 -- 谢谢,谢谢,不胜感激,确实如您所说的那样,我修改程序后就好了 |