Неуправляемая утечка памяти - PullRequest
7 голосов
/ 29 декабря 2011

Я использую приложение WPF, которое использует BitmapSource, но мне нужно сделать некоторые манипуляции, но мне нужно сделать некоторые манипуляции с System.Drawing.Bitmaps.

Использование памяти приложением увеличивается во время его работы.

Я сузил утечку памяти до этого кода:

private BitmapSource BitmaptoBitmapsource(System.Drawing.Bitmap bitmap)
{
            BitmapSource bms;
            IntPtr hBitmap = bitmap.GetHbitmap();
            BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions();
            bms = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, sizeOptions);
            bms.Freeze();
            return bms;
}

Я предполагаю, что неуправляемая память не утилизируется должным образом, но, похоже, я никак не могу это сделатьвручную.Заранее спасибо за любую помощь!

Алекс

Ответы [ 4 ]

9 голосов
/ 29 декабря 2011

Вам необходимо позвонить DeleteObject(...) на ваш hBitmap. Смотри: http://msdn.microsoft.com/en-us/library/1dz311e4.aspx

private BitmapSource BitmaptoBitmapsource(System.Drawing.Bitmap bitmap)
{
    BitmapSource bms;
    IntPtr hBitmap = bitmap.GetHbitmap();
    BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions();
    bms = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, 
        IntPtr.Zero, Int32Rect.Empty, sizeOptions);
    bms.Freeze();

    // NEW:
    DeleteObject(hBitmap);

    return bms;
}
4 голосов
/ 29 декабря 2011

Вам нужно позвонить DeleteObject(hBitmap) на hBitmap:

private BitmapSource BitmaptoBitmapsource(System.Drawing.Bitmap bitmap) {
        BitmapSource bms;
        IntPtr hBitmap = bitmap.GetHbitmap();
        BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions();
        try {
            bms = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, sizeOptions);
            bms.Freeze();
        } finally {
            DeleteObject(hBitmap);
        }
        return bms;
}
1 голос
/ 29 декабря 2011
0 голосов
/ 29 декабря 2011

Выпускаете ли вы дескриптор растрового изображения?

Согласно MSDN (http://msdn.microsoft.com/en-us/library/1dz311e4.aspx)

Вы несете ответственность за вызов метода GDI DeleteObject для освобождения памяти, используемой объектом растрового изображения GDIПодробнее о растровых изображениях GDI см. В разделе «Растровые изображения» в документации по Windows GDI.

...