BMPのメモリリーク – プログラミング – Home

通知
すべてクリア

[解決済] BMPのメモリリーク


万年係長
 万年係長
(@万年係長)
ゲスト
結合: 20年前
投稿: 17
Topic starter  

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
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

ビットマップを削除していないようです。


返信引用
万年係長
 万年係長
(@万年係長)
ゲスト
結合: 20年前
投稿: 17
Topic starter  

DeleteObject(h_BMP);
を追加したらメモリー解放無事完了しました。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました