非托管内存泄漏

本文关键字:泄漏 内存 | 更新日期: 2023-09-27 18:18:58

我正在使用使用BitmapSource的WPF应用程序,但我需要做一些操作但是我需要对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;
}

我认为这是未被妥善处理的非托管内存,但我似乎找不到手动处理的方法。提前感谢任何帮助!

亚历克斯

非托管内存泄漏

您需要在hBitmap上调用DeleteObject(...)。参见: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;
}

你需要在hBitmap上调用DeleteObject(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;
}

MSDN说你负责调用GDI DeleteObject方法来释放GDI位图对象使用的内存。下面的问题处理相同的问题,已经有答案WPF createbitmapsourcefrombitmap内存泄漏

是否释放位图句柄?

根据MSDN (http://msdn.microsoft.com/en-us/library/1dz311e4.aspx)

你负责调用GDI DeleteObject方法来释放GDI位图对象使用的内存。有关GDI位图的更多信息,请参见Windows GDI文档中的位图。