我用网上一段常见的代码读入JPG图片并显示(代码如下),我是在OnDraw()中调用的,结果只要我的界面一发生重绘,内存就会严重泄露,重绘一次内存就上涨一次,请教如何解决,谢谢帮助!
void CMonitorView::LoadPicture(CRect rect, CString FilePath, CDC *pDC)
{
IPicture   *pPicture;//声明OLE提供的图像对象
    IStream   *pStrm;//声明一个流对象   
    CFileStatus   fstatus;   
    CFile   file;   
    LONG   cb;   
if((file.Open(FilePath,CFile::modeRead))&&(file.GetStatus(FilePath,fstatus))&&((cb=fstatus.m_size)!=-1))   
{   
HGLOBAL   hGlobal=GlobalAlloc(GMEM_MOVEABLE,cb);   
LPVOID   pvData=NULL;   
if(hGlobal!=NULL)   
{   
if((pvData=GlobalLock(hGlobal))!=NULL)   
{   
file.ReadHuge(pvData,cb);//将图像文件数据读入内存   
GlobalUnlock(hGlobal);   
CreateStreamOnHGlobal(hGlobal,TRUE,&pStrm);//创建流对象   
if(SUCCEEDED(OleLoadPicture(pStrm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPicture)))   //根据流对象pStrm初始化图像对象pPicture   
{   
OLE_XSIZE_HIMETRIC   Width;   
OLE_YSIZE_HIMETRIC   Height;   
pPicture->get_Width(&Width);   
pPicture->get_Height(&Height);   
//得到图像的宽、高尺寸,注意该尺寸的逻辑单位不是图像的像素   
if(FAILED(pPicture->Render(*pDC,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,0,Height,Width,-Height,NULL)))
AfxMessageBox("渲染图片失败"); 
pPicture->Release();   
}   
else   
AfxMessageBox("从流中获取图片失败!");   
}   
}   
}   
   else  
   {
   AfxMessageBox("无法打开图像!"); 
   }

解决方案 »

  1.   

    GlobalAlloc申请的内存释放了吗?
      

  2.   

     file.ReadHuge(pvData,cb);//将图像文件数据读入内存   
    ReadHuge方法已经过进了,用Read吧.
    后面添加一下file.Close();
    if(SUCCEEDED(OleLoadPicture(pStrm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPicture)))   //根据流对象pStrm初始化图像对象pPicture   
       {   
         后面添加
          // 释放不要的stream对象并清空stream指针
          pStm->Release();
          pStm=NULL;
        
     
      pPicture->Release();   
    后面添加
    // 释放不要的picture对象,并把指针清空
          pPic->Release(); 
          pPic=NULL;      //释放不要的全局内存对象,这个千万别忘了(32位程序不需要这行,系统会自动释放;16位程序一定要)
          FreeResource(hGlobal);
      

  3.   

     最后一步错了,应为:
    pPicture->Release();  
    后面添加 
    // 释放不要的picture对象,并把指针清空 
              pPicture=NULL;       //释放不要的全局内存对象,这个千万别忘了(32位程序不需要这行,系统会自动释放;16位程序一定要) 
          FreeResource(hGlobal);
      

  4.   

    TO1楼:
    我刚刚查资料也发现了这个问题,确实是没有调用GlobalFree()函数,呵呵,以前从来没用过。
    请问下,所有的GlobalAlloc()都要和GlobalFree()配套使用吗,就像new和delete一样?谢谢
      

  5.   

    谢谢wqvbjhc
    //释放不要的全局内存对象,这个千万别忘了(32位程序不需要这行,系统会自动释放;16位程序一定要) 
          FreeResource(hGlobal);
    我的就是32位的程序吧应该?如果我不调用这句的话内存就会长。
    你说32位程序系统会自动释放是不是说在我程序退出的时候系统才会释放啊?谢谢你
      

  6.   

    是在OnDrow()里调用LoadPicture的吧.
    那就是每次都分配一次内存.
    所以每次都要释放.
      

  7.   

    // IPicture 类:CPicture - The Yovav (Horror) PictureShow
    http://www.codeproject.com/KB/graphics/pictureshow.aspx
      

  8.   

    用GDI+吧  比你方法简单多了 http://blog.csdn.net/bobohack/archive/2009/01/19/3837065.aspx
      

  9.   

    CImage,
    VS2008, sp1
    可以支持 jpg gif png,内部就是使用 GDI+。
    不过可惜的是不支持从资源中载入图像。