1

C++ プログラムで頻繁に HBITMAP イメージを作成する必要があり、もちろん使用後にこれらのビットマップを削除する必要があります。コードはこれに似ています

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

HBITMAP を継続的に作成し、このビットマップを使用する関数を呼び出してから削除するスレッドに無限サイクルがあります。ループの開始時に、プロセスのメモリ使用量が前のサイクルよりも大きいかどうかを確認し、大きい場合は出力します。CreateBitmap() および DeleteObject() を使用すると、わずかなメモリ リークが発生します。プロセスのメモリ使用量が時々 4KB 増加します (10 秒ごとの場合もあれば、数分間何も起こらない場合もあります)。

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

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

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

テクニカル ノート: Windows XP Borland C++ Builder 5

4

2 に答える 2

1

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

于 2011-05-17T16:38:38.187 に答える
0

問題が通常、人々が示さないコードにどのようにあるかおかしい。

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

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

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

于 2011-05-17T16:48:33.853 に答える