Out of memory でプログラム停止 – プログラミング – Home

Out of memory でプログラ...
 
通知
すべてクリア

[解決済] Out of memory でプログラム停止


がーがん
 がーがん
(@がーがん)
ゲスト
結合: 17年前
投稿: 3
Topic starter  

はじめまして、現在ビットマップを読み込んで
任意の場所に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();
}


引用未解決
トピックタグ
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

imageDCと互換性のあるmemDCを作って、
作ったばかりのmemDCからimageDCにコピーしてるの?
本当に数分間正常に動作するプログラムですか?
間が何か省略されているのかな?

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

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


返信引用
がーがん
 がーがん
(@がーがん)
ゲスト
結合: 17年前
投稿: 3
Topic starter  

// 初期化で一度だけ読み込み
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に繰り返し表示させています


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

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

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


返信引用
麩
 麩
(@麩)
ゲスト
結合: 17年前
投稿: 95
 

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

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

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


返信引用
+
 +
(@ )
ゲスト
結合: 17年前
投稿: 50
 

呼び出し元でimageDCを解放してないとか、
別の場所でリークしてるとか。

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


返信引用
がーがん
 がーがん
(@がーがん)
ゲスト
結合: 17年前
投稿: 3
Topic starter  

みなさん誤指導ありがとうございました。

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

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

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

// グローバルに定義
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();
}


返信引用
菟ー
 菟ー
(@菟ー)
ゲスト
結合: 17年前
投稿: 21
 

>>誤指導ありがとうございました。
ぐは!

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

駄レスすみませんw


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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