wince5.0下内存泄露,很微小的,几分钟增长4k

lulidpj   2010-5-5 20:16 楼主
定时器3秒执行一次

  1. Invalidate();
  2. UpdateWindow();

整个程序就干这一件事,隔3秒显示一张图片。但是我用wince的系统属性查看正在使用的内存数,隔几分钟就会增长4K,我联系观察了几个小时,很有规律。

  1. void CshowphotoDlg::OnPaint()
  2. {
  3.         CPaintDC dc(this); // device context for painting

  4.         static BYTE i=0;
  5.         TCHAR strtp[256];
  6.         wsprintf(strtp,L"\\nand flash\\cdqres\\%d.bmp",i%3);
  7.         i++;
  8.         HBITMAP hBitmapBk;
  9.         hBitmapBk=(HBITMAP)SHLoadDIBitmap( strtp);

  10.         CRect rectBK; // 客户区的大小
  11.         CDC dcTemp;
  12.         CBitmap clientBmp;
  13.         CBitmap bmBK; // 位图对象
  14.         bmBK.Attach( hBitmapBk );

  15.         BITMAP stBitmap;
  16.         bmBK.GetObject(sizeof(BITMAP),&stBitmap);
  17.         CSize bmSize(stBitmap.bmWidth,stBitmap.bmHeight);

  18.         dcTemp.CreateCompatibleDC(&dc);
  19.         CBitmap *pOld=dcTemp.SelectObject(&bmBK);

  20.         GetWindowRect(&rectBK); // 取得客户区的大小

  21.         dcMen.CreateCompatibleDC(&dc);
  22.         clientBmp.CreateCompatibleBitmap(&dc,rectBK.Width(),rectBK.Height());
  23.         CBitmap *pOld1=dcMen.SelectObject(&clientBmp);
  24.        
  25.         dcMen.StretchBlt(rectBK.left,rectBK.top,rectBK.Width(),rectBK.Height(),&dcTemp,0,0,bmSize.cx,bmSize.cy,SRCCOPY);
  26.        
  27.         dc.BitBlt(rectBK.left,rectBK.top,rectBK.Width(),rectBK.Height(),&dcMen,rectBK.left,rectBK.top,SRCCOPY);

  28.         dcTemp.SelectObject(pOld);
  29.         dcTemp.DeleteDC();
  30.         dcMen.SelectObject(pOld1);
  31.         dcMen.DeleteDC();

  32.         bmBK.Detach();
  33.         clientBmp.DeleteObject();

  34.         DeleteObject(hBitmapBk);
  35. }

回复评论 (7)

如果有,应该是DC的操作

但是偶没有看出来,只能建议LZ将代码分拆测试,看看具体是哪部分出的问题

也有可能,只是产生了内在碎片,CE系统没有及时回收
点赞  2010-5-6 08:49
建议LZ,不要将hBitmapBk=(HBITMAP)SHLoadDIBitmap( strtp);放在循环体内(定时循环)

最好在应用启动时加载,结束时释放.
点赞  2010-5-6 08:51
据说wince的兼容位图天生会泄露内存,微软也还没解决。建议LZ不要经常使用兼容位图,不要频繁创建
点赞  2010-5-6 09:25
引用: 引用 3 楼 domworldjohn 的回复:

据说wince的兼容位图天生会泄露内存,微软也还没解决。建议LZ不要经常使用兼容位图,不要频繁创建


赞lz仔细分析问题的精神

看大牛解答共同提高
点赞  2010-5-6 11:13
有内存泄露的为问题很正常,usb的host部分驱动就有泄漏,自己找了半天才找到,这些问题通常都在bsp中,修改应用使用方法基本没啥用,只要没有致命的问题,就凑活着用吧。
点赞  2010-5-6 17:09
我在网上发现了一篇文章,由于我的擦除背景函数没用,只有一句return true;,所以我把Invalidate();改成Invalidate(0);就没问题了。内存不再增加。
另一问题,在程序第一次退出,再启动后,发现内存多出了48k,以后程序退出再启动都不会多。系统掉电再试,结果和前面的描述一样。
点赞  2010-5-6 17:30
好贴,收藏了~!
点赞  2010-5-6 17:32
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复