Maison >développement back-end >C++ >Comment éviter les fuites de mémoire lors de l'utilisation de CreateBitmapSourceFromHBitmap() de WPF ?

Comment éviter les fuites de mémoire lors de l'utilisation de CreateBitmapSourceFromHBitmap() de WPF ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-10 11:02:41271parcourir

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

Résolution des fuites de mémoire dans WPF lors de l'utilisation de CreateBitmapSourceFromHBitmap()

Un problème fréquent lors de la génération d'images pixel par pixel dans les applications WPF résulte de l'utilisation de CreateBitmapSourceFromHBitmap() pour convertir un System.Drawing.Bitmap en un BitmapSource. Cette conversion entraîne souvent des fuites de mémoire car la mémoire de l'objet bitmap GDI n'est pas automatiquement libérée jusqu'à la fermeture de l'application.

La solution : une bonne gestion des ressources

La documentation de Microsoft pour Bitmap.GetHbitmap() indique clairement que les développeurs doivent libérer manuellement la mémoire de l'objet bitmap GDI à l'aide de la méthode DeleteObject. Cette étape cruciale empêche l’accumulation de mémoire.

L'exemple de code suivant illustre la technique correcte de gestion de la mémoire :

<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>

L'instruction using garantit que l'objet System.Drawing.Bitmap est correctement éliminé, même si des exceptions se produisent. Ceci, combiné à l'appel explicite à DeleteObject, garantit la libération des ressources GDI et évite les fuites de mémoire. Cette bonne pratique est essentielle pour créer des applications WPF robustes et efficaces.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn