当前位置: 代码迷 >> WinCE >> wince里onpaint里用双缓冲机制拷屏时内存储器不能归还
  详细解决方案

wince里onpaint里用双缓冲机制拷屏时内存储器不能归还

热度:37   发布时间:2016-04-28 12:56:06.0
wince里onpaint里用双缓冲机制拷屏时内存不能归还
现有一个程序,需要不断调用onpaint刷新屏幕。为防止屏幕闪烁,采用了双缓冲拷屏,但运行中发现内存不断流失,单步执行时发现是内存不能归还,请各位大师救命。
代码如下,单步运行时现象也注解在后面:
void CTC_MonitorDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
     CRect rc;
dc.GetClipBox (&rc); //取得当前客户区大小
     CDC MemDC;
MemDC.CreateCompatibleDC (&dc);
CBitmap bm;
bm.CreateCompatibleBitmap (&dc, rc.Width( ), rc.Height( ));//这里内存减少了1个多K
CBitmap *pOldbmp=MemDC.SelectObject (&bm);

     CFont font,fontsmall;//内存扣去4个字节
     MemDC.DrawText(_T("曲线图"),-1,&CurrentRect,DT_VCENTER|DT_LEFT);;//内存减少4个字节
     MemDC.DrawText(CurrentStr,-1,&CurrentRect,DT_VCENTER|DT_LEFT);//内存不减少
     //中间是绘图,限于篇幅不全列出

     MemDC.MoveTo(GpToSp(0,(fMaxWeight),R0,0,fMaxWeight,0));//内存减少4个字节,其它类似函数不减少         MemDC.LineTo(GpToSp(R0,0,R0,0,fMaxWeight,0));//内存不减少

dc.BitBlt(0, 0, rc.Width ( ), rc.Height ( ), &MemDC, 0, 0, SRCCOPY);

MemDC.SelectObject(pOldPen);
MemDC.SelectObject(pOldFont);

pBluePen->DeleteObject();
pWhitePen->DeleteObject();
pCyanPen->DeleteObject();
font.DeleteObject();//内存不能归还
fontsmall.DeleteObject();  //内存不能归还 
     bm.DeleteObject ( ); //内存不能归还
     MemDC.DeleteDC ( );//内存不能归还
}
上述的内存都不能归还,每调用一次on paint都少几个K内存,最后内存耗尽程序不能动了。诡异的是相同的函数有的内存减少有的不减少,令人百思不得其解。

------解决方案--------------------
最近在wince 用MFC作绘图的程序。

CDC *pCD = GetDC();

CDC memDC;

CBitmap memBitmap;

CPen newPen;


....

....//后面是画图代码

//以上定义的这些量都会在我的绘图的for()循环中,反复定义反复使用,其中,memBitmap, newPen,是供memDC在内存中画图使用的。
//正常的思维都是在使用完之后销毁。

newPen.DeleteObject();
memBitmap.DeleteObject();

memDC.DeleteDC();
pDC->ReleaseDC();

//如此释放




 

那么,这么释放的话,等for循环次数多了,wince就会提示内存不足,出现内存泄露。

那么,上面代码明明白白的写出来了,关于对使用的量进行释放。为什么还是出现内存泄露呢?

google了很久,后来在微软官方找到了解决办法。

http://support.microsoft.com/kb/819635/zh-cn

但是,按照他的办法,我还是出现了内存泄露。程序运行一段时间之后,会出现内存不足,内存泄露的问题。

后来,开始对代码进行调试,经过调试,我发现,

memBitmap.DeleteObject()

newPen.DeleteObject();

这两句运行之后,内存根本就没有释放空间。这说明这两句话没有起到释放的作用。

那么为什么没有起到作用呢? 莫非是因为memBitmap 和newPen还在使用当中?

于是调换了释放顺序如下:

memDC.DeleteDC();
newPen.DeleteObject();
memBitmap.DeleteObject()
pDC->ReleaseDC();


//newPen,memBitmap在memDC释放之后再释放。 

问题就解决了,内存泄露问题解决了。
  相关解决方案