Out of memory でプログラム停止

[戻る]
がーがん 2007/10/18(木) 21:27:35
はじめまして、現在ビットマップを読み込んで
任意の場所にBMPを表示するプログラムを作成していますが
下記のコードを数分実行後にプログラムが " Out of memory "
と言うエラーを出してとフィリーズしてしまいます。
理由がわかる方、ご指導願います。
宜しくお願い致します。

開発環境 vc++6.0 MFC ダイアログベース

// 初期化で一度だけ読み込み
bmp.LoadBitmap(IDB_BMP_HOGE);
・
・
・
// 100msecに一度繰り返し実行
HOGE(CMemDC *imageDC)
{
    memDC.CreateCompatibleDC(imageDC)
    memDC.SelectObject(&bmp);

    imageDC->BitBlt(x,y,50,50,&memDC,0,0,SRCCOPY);

    memDC.DeleteDC();
}

たいちう 2007/10/18(木) 21:48:36
imageDCと互換性のあるmemDCを作って、
作ったばかりのmemDCからimageDCにコピーしてるの?
本当に数分間正常に動作するプログラムですか?
間が何か省略されているのかな?

memDCとHOGEの関係は?どっちもダイアログのメンバーかな?
CMemDCとは?
imageDCのインスタンスはどこ? 100ms毎に作成されるの?

これらの情報がもう少し明らかになれば、私でも答えられるかも。

がーがん 2007/10/18(木) 22:01:57
// 初期化で一度だけ読み込み
bmp.LoadBitmap(IDB_BMP_HOGE);
・
・
・
// 100msecに一度繰り返し実行
HOGE(CMemDC *imageDC)
{
    CDC memDC;   -> 追加
    CBitmap bmp; -> 追加
    memDC.CreateCompatibleDC(imageDC)
    memDC.SelectObject(&bmp);

    imageDC->BitBlt(x,y,50,50,&memDC,0,0,SRCCOPY);

    memDC.DeleteDC();
}
説明
bmp.LoadBitmapで読み込んだ画像をmemDCに繰り返し表示させています

たいちう 2007/10/18(木) 22:54:47
> 説明
> bmp.LoadBitmapで読み込んだ画像をmemDCに繰り返し表示させています

だから、そういうことをしているようなソースには見えないんですが。
BitBltの使い方が逆じゃない?

2007/10/19(金) 00:12:34
>BitBltの使い方が逆じゃない?
「CMemDC *imageDC」となっていますが、CMemDCというクラスはVC6のMFC
に含まれていなさそうなのですが。
そのあたりであべこべになっていませんか?

もう一つ、「HOGE(CMemDC *imageDC)」の中で「CBitmap bmp」を宣言して
いますが、LoadBitmapを行っているインスタンスと同じならその書き方は誤解を
招きます。
関係する変数の宣言場所や、LoadBitmap等を行っている場所の説明なども
省略しないほうがいいと思います。
SelectObjectした後戻していない点も少し気になります。

あと、「CDC memDC」はディスプレイの色数とかが変わらなければ作り直さなくて
もいいので、0.1秒に一回と比較的高頻度で呼ぶ場合はLoadBitmapと同じ場
所で作ってやっても良い筈です。

+ 2007/10/19(金) 09:16:16
呼び出し元でimageDCを解放してないとか、
別の場所でリークしてるとか。

どちらにせよ、クラッシュするまで動かさず
デバッグ途中でアプリを終了させれば
IDEの「メモリリークディテクタ」が場所を教えてくれると予想。

がーがん 2007/10/20(土) 08:48:04
[[解決]]
みなさん誤指導ありがとうございました。

>別の場所でリークしてるとか。

そうでした。お騒がせしました。

ちなみに以下あべこべと指摘された
コードの流れです。

// グローバルに定義
CDC memDC;
CBitmap bmp;

// 初期化で読み込み
bmp.LoadBitmap(IDB_DANGER);

CPaintDC dc(this);
CMemDC imageDC(&dc);
↓
drawMarkings(&imageDC);
↓
drawMarkings(CMemDC *imageDC)
{
    memDC.CreateCompatibleDC(imageDC);
    memDC.SelectObject(&bmp);
    imageDC->BitBlt(xloc-9,yloc-30,18,17,&memDC,0,0,SRCCOPY);
    memDC.DeleteDC();
}

菟ー 2007/10/20(土) 17:06:00
>>誤指導ありがとうございました。
ぐは!

ただのタイプミスならいいけど狙ってたら・・・
(´▽`*)アハハ 

駄レスすみませんw

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