主题:[原创]请教下大家,我这个MFC双缓冲代码哪里存在内存泄漏? 共有40429人关注过本帖 |
---|
客人 |
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 [只看该作者]
谢谢,谢谢,不胜感激,确实如您所说的那样,我修改程序后就好了 |
|
单帖管理 | 引用 | 回复 |