一回も披露したことのない豆知識

Microsoft VC++6.0 で、画像を表示するアプリケーションを作っていて、GDI+ で様々な画像を呼び出せるようにしています。
Gdiplus::Bitmap* pGdiBitmap = Gdiplus::Bitmap::FromFile( ファイル名 ) ;
で呼び出し、
HBITMAP hBitmap ;
pGdiBitmap->GetHBITMAP(color , hBitmap)
によりHBITMAPを取得し、
CBitmap* pBitmap
をクラス内に用意し、BitBlt() 関数で画像データを pBitmap にコピーし、その後
delete pGdiBitmap
で削除しています。CBitmap* pBitmap にデータを保持していればいいので。

しかし、ファイルを「開く→閉じる」を繰り返し20回や30回行うと、画像を読み込めなくなりました。
最初に調べたのが、
「pGdiBitmap を読み込んだ後に pGdiBitmap->GetHBITMAP() を実行すると戻り値が、
OutOfMemory = 3」
でした。
そこで、タスクマネージャでメモリを見ながら画像を何度も開くと、開いた画像を閉じてもメモリはそんぽままで、画像を開く度にメモリが増え、150Mとかになって、メモリ不足になることがわかりました。

 これは、delete pGdiBitmap ではダメと言うことですか?それとも、プログラムがおかしいでしょうか。

Windows7 , Microsoft VC++6.0 Professional Edition , (Microsoft Platform SDK)

class CMyPicture
{
public
(コンストラクタなど)
void LoadPicture(LPCTSTR lpszFilename);

protected:
CBitmap* m_pBitmap ;
}

void CMyPicture::LoadPicture(LPCTSTR lpszFilename)
{
HBITMAP hBitmap ;

WCHAR wPath[MAX_PATH] ;
※ファイル名 lpszFilename をMultiByteToWideChar()で変換済み

Gdiplus::Bitmap* pGdiBitmap = Bitmap::FromFile(wPath , TRUE) ;

Status r = pGdiBitmap->GetHBITMAP( Color(0,0,0,0) , &hBitmap) ;

※ CDC dcMemory などを用意してBitBlt()で hBitmap から(CBitmap*)m_pBitmap に転送

delete pGdiBitmap ;
}

こんな感じです。
画像を開いて表示すること自体は成功していますが、画像を閉じてもメモリをどんどん使ってしまいます。
根本的に何か間違っていますか?GDI+をVC++6.0で使っていては限界なのでしょうか。
どなたか、教えていただけると助かります。

A 回答 (1件)

> CDC dcMemory などを用意してBitBlt()で hBitmap から(CBitmap*)m_pBitmap に転送



ここで確保したメモリーを、解放してますか?
あるいは
使い回すはずのメモリーを、画像を開く度に毎回確保してませんか?

あと、pGdiBitmap->GetHBITMAP のあとで、ReleaseDCが無いようですが。

この回答への補足

ありがとうございます。
全て確保したメモリーの解放は行っています。
・デバイスコンテキストも解放しています。
・CBitmap* m_pBitmap = new CBitmap ; は delete m_pBitmap ;で解放
GDI+ さえ使っていなければ、メモリリークは一切ないので、やはりGDI+ で何かメモリが解放されていないようです。

補足日時:2013/07/04 11:51
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!