ホームページ >バックエンド開発 >C++ >WPF の CreateBitmapSourceFromHBitmap() を使用するときにメモリ リークを回避するにはどうすればよいですか?

WPF の CreateBitmapSourceFromHBitmap() を使用するときにメモリ リークを回避するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-10 11:02:41271ブラウズ

How to Avoid Memory Leaks When Using WPF's CreateBitmapSourceFromHBitmap()?

CreateBitmapSourceFromHBitmap() を使用する場合の WPF でのメモリ リークへの対処

WPF アプリケーションで画像をピクセルごとに生成するときに頻繁に発生する問題は、CreateBitmapSourceFromHBitmap()System.Drawing.Bitmap に変換するために BitmapSource を使用することによって発生します。 GDI ビットマップ オブジェクトのメモリはアプリケーションが終了するまで自動的に解放されないため、この変換はメモリ リークにつながることがよくあります。

解決策: 適切なリソース管理

Bitmap.GetHbitmap() に関する Microsoft のドキュメントには、開発者が DeleteObject メソッドを使用して GDI ビットマップ オブジェクトのメモリを手動で解放する必要があると明確に記載されています。この重要なステップは、メモリの蓄積を防ぎます。

次のコード例は、正しいメモリ管理手法を示しています。

<code class="language-csharp">// Import DeleteObject from gdi32.dll
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);

// Use a using statement for proper resource disposal
using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(1000, 1000)) 
{
    IntPtr hBitmap = bmp.GetHbitmap();

    try 
    {
        var source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
        // Use the 'source' BitmapSource here...
    }
    finally 
    {
        DeleteObject(hBitmap);
    }
}</code>

using ステートメントは、例外が発生した場合でも、System.Drawing.Bitmap オブジェクトが適切に破棄されることを保証します。 これと DeleteObject の明示的な呼び出しと組み合わせることで、GDI リソースの解放が保証され、メモリ リークが防止されます。 このベスト プラクティスは、堅牢で効率的な WPF アプリケーションを作成するために不可欠です。

以上がWPF の CreateBitmapSourceFromHBitmap() を使用するときにメモリ リークを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。