C# [WPF] "kleines" Speicherleck ...

locomarco

Commander
Registriert
Aug. 2009
Beiträge
2.446
Um ein Bitmap zu einem BitmapSource umzuwandeln hab ich folgenden Code:
Code:
IntPtr hBitmap;
Bitmap bmp;
BitmapSource bmpSrc;
...
private void blabla()
{
	hBitmap = bmp.GetHbitmap();
	bmpSrc = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}

Sobald hBitmap = bmp.GetHbitmap(); im Code steht, steigt der Speicherverbrauch von meinem Programm pro Sekunde um 2-5mb.
Nach ca. 5 Minuten liegt der verbrauch dann bei ~1,3gb und GDI+ verabschiedet sich mit einer ExternalException: "Allgemeiner Fehler in GDI+."

Habs schon mit hBitmap = IntPtr.Zero, GC.WaitForPendingFinalizers() und GC.Collect() probiert. Hilft leider nichts.
 
Äh, Speicherleck in C#? Ich kenn die Sprache jetzt nicht wirklich, aber hat die keinen Garbage Collector? :E
 
Dazu muesste das Bitmap managed sein und das erreicht er ja erst indem er es zu einer Bitmapsource umwandelt ;)

das problem ist hBitmap. Es wird naemlich nicht automatisch geloescht. du musst mit try {..} finally { DeleteObject(hBitmap); } den speicher wieder freigeben.

hier noch ein kleiner link als hilfe: Bitmap to BitmapSource
 
Du musst die Referenz mittels der GDI-"DeleteObject"-Methode wieder löschen.

Code:
// GDI-Funktion
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);

// dein Code
IntPtr hBitmap;
Bitmap bmp;
BitmapSource bmpSrc;
...
private void blabla()
{
	hBitmap = bmp.GetHbitmap();
	bmpSrc = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
	DeleteObject(hBitmap);
}
 
Danke euch beiden, mit DeleteObject() funktionierts :)
 

Ähnliche Themen

Zurück
Oben