void CSssView::OnPaint() 
{
    CPaintDC dc(this); // device context for painting    CBitmap *bmp;
    
   mdc->SelectObject(bmp);
   dc.BitBlt(0,0,400,266,mdc,0,0,SRCCOPY);}void CSssView::OnShift() //显示下一张图片;
{
    iCount++;
    
    delete bmp;//释放bmp内存;
    bmp= new CBitmap;
    ReleaseDC(mdc);//释放mdc内存;switch(iCount)
{
case 1:
    bmp->LoadBitmap(IDB_BITMAP2);
    break;
case 2:
    bmp->LoadBitmap(IDB_BITMAP3);
    break;
case 3:
    bmp->LoadBitmap(IDB_BITMAP4);
    break;
default:
    break;
}
    InvalidateRect(NULL,NULL);
}int CSssView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;
    CClientDC dc(this);
    // TODO: Add your specialized creation code here
    iCount=0;
    CDC     *mdc;
    bmp=new CBitmap;
    mdc=new CDC;
    mdc ->CreateCompatibleDC(&dc);
    bmp->LoadBitmap(IDB_BITMAP1);
    return 0;
}上面的这段代码执行时,每次显示下一张图片(执行OnShift()函数)时,从Windows任务管理器中看进程的内存使用量都在按图片的大小增加;
我用了   delete bmp;//释放bmp内存;
  
    和ReleaseDC(mdc);//释放mdc内存;
为什么以前的内存没有释放掉???
如何才能释放掉上一张图片所占用的内存???

解决方案 »

  1.   

    我试了用DeleteObject也不行呀,关键是我想显示下一张图片时,同时释放掉上一张所占的内存 不要,每次显示下一张图片(执行OnShift()函数)时
    从Windows任务管理器中看进程的内存使用量都在按图片的大小增加; 
      

  2.   

    你的代码不是这个样子的吧,怎么我看你的代码里面bmp,mdc,一会类变量,一会函数局部变量的。
      

  3.   

    代码有几处打错了,bmp,mdc,都是类变量,请高手救命呀!!!
      

  4.   

    bmp在dc中的时候,删除bmp不能真正释放内存
    每次将图片选入dc的时候,保存原来的dc中的图片,然后在删除图片之前,将保存的原来的图片选入dc,再删除图片
    请试一下
      

  5.   

    能帮我改改,下面的这行代码吗???
    void CSssView::OnPaint()  

        CPaintDC dc(this); // device context for painting 
         
       mdc- >SelectObject(bmp); 
       dc.BitBlt(0,0,400,266,mdc,0,0,SRCCOPY); } void CSssView::OnShift() //显示下一张图片; 

        iCount++; 
         
        delete bmp;//释放bmp内存; 
        bmp= new CBitmap; 
        ReleaseDC(mdc);//释放mdc内存; switch(iCount) 

    case 1: 
        bmp- >LoadBitmap(IDB_BITMAP2); 
        break; 
    case 2: 
        bmp- >LoadBitmap(IDB_BITMAP3); 
        break; 
    case 3: 
        bmp- >LoadBitmap(IDB_BITMAP4); 
        break; 
    default: 
        break; 

        InvalidateRect(NULL,NULL); 
    } int CSssView::OnCreate(LPCREATESTRUCT lpCreateStruct)  

        if (CView::OnCreate(lpCreateStruct) == -1) 
            return -1; 
        CClientDC dc(this); 
        // TODO: Add your specialized creation code here 
        iCount=0; 
        bmp=new CBitmap; 
        mdc=new CDC; 
        mdc - >CreateCompatibleDC(&dc); 
        bmp- >LoadBitmap(IDB_BITMAP1); 
        return 0;