非托管内存泄漏

时间:2011-12-29 16:06:56

标签: c# wpf memory bitmap unmanaged

我使用的是使用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;
}

我认为这是非托管内存没有正确处理,但我似乎无法手动找到它。在此先感谢您的帮助!

亚历

4 个答案:

答案 0 :(得分:9)

您需要在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;
}

答案 1 :(得分:4)

您需要在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;
}

答案 2 :(得分:1)

答案 3 :(得分:0)

您是否正在发布位图句柄?

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

  

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