BMPのメモリリーク

[戻る]
万年係長 2005/03/17(木) 15:34:09
Windows2000 SP4 VC++6.0 MFC
初めまして。
ボタンを押すとBMPを読み込みPictureboxに表示させているのですが、
何回も上の処理をするとメモリがたまってしまいます。
10Mずつくらいの割合で増えます。
(windowsタスクマネージャーで確認済み)
メモリ解放を行っているつもりですが、どこか見逃しているようです。
どなたかご教授お願いします。

void CTest::BMPOPEN(CString FilePass)
{
    CRect ClientRect;//フォームのクライアント領域を取得する

    CDC* pDC;//メモリデバイスコンテキストの取得と作成  
    
    GetDlgItem(IDC_MASTER1)->GetClientRect(ClientRect);
    //メモリデバイスコンテキストの取得と作成
    pDC = GetDlgItem(IDC_MASTER1)->GetDC();
        
    
    //ビットマップファイルを読み込むためにCBitmapクラスオブジェクトを作成
    BITMAP BMP;
    RECT rectt;

    HBITMAP h_BMP = (HBITMAP)LoadImage(
        AfxGetApp()->m_hInstance, // ロードするインスタンスハンドル
        _T(FilePass),             // ロードする画像ファイル名
        IMAGE_BITMAP,             // ロードする画像ファイルのタイプ
        0,                        // アイコンやカーソルの幅をピクセル
        0,                        // 高さ(上に同じ)
        LR_LOADFROMFILE);         // 

    CDC MemDC;
    MemDC.CreateCompatibleDC(pDC);
    //ビットマップオブジェクトを選択
    HBITMAP h_OLD_BMP = (HBITMAP)::SelectObject( MemDC.m_hDC, h_BMP );
    //ビットマップの情報を取得
    ::GetObject(h_BMP,sizeof(BITMAP),&BMP);

    GetDlgItem(IDC_DISPLAY)->GetWindowRect(&rectt);
    ScreenToClient(&rectt);

    int DISPLAYWIDTH = rectt.right-rectt.left; //560 座標で表したBMP幅
    int DISPLAYHEIGHT = rectt.bottom-rectt.top;//465 座標で表したBMP高さ

    //座標からピクセルに変換処理
    //ピクセルXYの倍率を求める
    float PixelX_Bai = (float)BMP.bmWidth / (float)DISPLAYWIDTH;
    float PixelY_Bai = (float)BMP.bmHeight / (float)DISPLAYHEIGHT;

    float BMP_haba=((float)lastP.x - (float)startP.x)*PixelX_Bai;
    float BMP_takasa=((float)lastP.y - (float)startP.y)*PixelY_Bai;

    int haba=Int_Float(BMP_haba);
    int takasa=Int_Float(BMP_takasa);

    //スタート位置をピクセルに変換
    float sabun_X=(float)rectt.left;
    float sabun_Y=(float)rectt.top;
    float start_X=((float)startP.x-sabun_X)*PixelX_Bai;
    float start_Y=((float)startP.y-sabun_Y)*PixelY_Bai;
    int za_haba=Int_Float(start_X);
    int za_takasa=Int_Float(start_Y);

    //画像を縮小する&アイテム配置
    pDC->StretchBlt(
        0,                     // 転送先のBMPの左上隅の論理x座標
        0,                     // 転送先のBMPの左上隅の論理y座標
        ClientRect.right,      // 転送先のBMPの幅
        ClientRect.bottom,     // 転送先のBMPの高さ
        &MemDC,                // CDCオブジェクトのポインタ
        za_haba,               // 転送元のBMPの左上隅の論理x座標 0
        za_takasa,             // 転送元のBMPの左上隅の論理y座標 0
        haba,                  // 転送元のBMPの幅 (ピクセル) 
        takasa,                // 転送元のBMPの高さ(ピクセル) 
        SRCCOPY);              // ラスタオペレーションコード
    // オブジェクトを元に戻す
    ::SelectObject(MemDC.m_hDC, h_OLD_BMP );
    MemDC.DeleteDC();
    //メモリ解放
    ReleaseDC(pDC);
}

dairygoods 2005/03/17(木) 15:53:14
ビットマップを削除していないようです。

万年係長 2005/03/17(木) 16:11:11
[[解決]]
DeleteObject(h_BMP);
を追加したらメモリー解放無事完了しました。

dairygoodsさんありがとうございます。

古いスレッドには追加発言できません。