2011-05-17 13 views
1

C++プログラムで非常に頻繁にHBITMAPイメージを作成する必要があります。使用後にこれらのビットマップを削除する必要があります。 コードは、私が継続的に、HBITMAPを作成し、このマップを使用する関数を呼び出して、それを削除したスレッドに無限のサイクルを持っているこのWIndows関数DestroyObject for HBITMPがうまく動作しない(メモリリーク)

HBITMAP hBmp; 
while(true) { 
    hBmp = CreateBitmap(width, height, 1, 8, imageData); 
    process(hBmp); 
    DeleteObject(hBmp); 
} 

に似ています。ループの開始時に、プロセスのメモリ使用量が以前のサイクルよりも大きいかどうかをチェックし、そうであれば印刷します。 CreateBitmap()およびDeleteObject()を使用すると、メモリリークが小さくなります。プロセスメモリの使用量は4KBずつ増加します(10秒ごとに、時には何も起こらないことがあります)。

私はプロセス関数も呼び出さずにテストしましたが、問題はまだ残っていますので、ビットマップ処理が原因だと思います。 さらに、私は無限ループの外側にイメージを作成して(私はそれを1回だけ作成します)、ループで時間を無限に処理し、メモリリークが発生しないようにテストしました。

注:DeleteObject()は常に値> 0(エラーなし)を返します。

問題はDeleteObject()関数に関連している可能性はありますか?このようにビットマップの作成/削除に何か問題はありますか?

テクニカルノート: のWindows XP ボーランドC++ Builderの5

答えて

1

ビットマップがまだどこかでデバイスコンテキストに選択されているいずれかの可能性はありますか?それは私がそれがエラーを返すと思いますが、DeleteObjectが失敗する可能性があります。

+0

私はHBITMAPを使用していなくても、たとえばCreateBitmapの直後にDeleteObjectがある場合でもリークが発生します。他のものは、私は1 MBの周りの画像を "読み込む"ので、DeleteObjectが失敗した場合、私は4KBではなく1MBのメモリ "ステップ"を期待しています。 –

0

面白いどのように問題が通常のコードの人々ですを表示します。

process関数内では、デバイスコンテキスト内でビットマップを選択していますが、再度選択しないので、削除しようとするとデバイスコンテキストの一部になります。

あなたのコンテキストが適切に解放されているわけではなく、選択した他のすべてのオブジェクトもそうではありません。あなたはそこで起こっているいくつかの巨大なメモリリークを持っています。もちろん、あなたは私たちにコードを示すわけではありませんので、具体的にあなたを助けることはできません。

最後に、リリースするために何度も何度も新しいビットマップを作成する理由を正確には分かりません。ループの外でデバイスコンテキストを作成し、それをデバイスコンテキスト内で選択し、からにループを開始し、ビットマップをクリアして書き込みを開始する必要があります。パフォーマンスが大幅に向上します。

+0

"プロセス"関数の問題については、私がこの関数を呼び出さなくても(例えば、私は単純にコメントしています)、リークの問題が発生する前に言いました。したがって、HBITMAPを作成して削除するだけで(どこでも使用することなく)、メモリリークが発生します。 –

+0

反対に、HBITMAPの作成/削除についてコメントしても、漏れはありません。どのサイクルでもビットマップを作成する理由については、ビットマップのサイズ(幅、高さ)がどのサイクルでも異なっている可能性があるため、作成しました。毎回新しいディメンションを指定する必要がある可能性があります。最後に、私は、 "デバイスコンテキスト"の使用に慣れていません。いいリンクはありますか?ありがとう! –

+0

これは比較的簡単です。デバイスコンテキスト(HDC)では、常にビットマップ、フォントなどが選択されています。ビットマップで選択すると、古いものへのポインタが得られます。それを選択することはできません。古いものを選択するだけで、ビットマップを押し出すことができます。したがって、 'SelectObject'を呼び出すたびに、' process'が終了する前にそれを選択するハンドルを保存してください。 – Blindy