此位图会导致内存泄漏吗?

时间:2018-08-13 14:27:05

标签: .net vb.net winforms bitmap

我有以下代码将图像调整为特定大小:

Public Sub ResizeBitmap(ByRef uSource As Bitmap, ByVal uSize As Size)

    Dim nBmp As New Bitmap(uSize.Width, uSize.Height)

    Using g As Graphics = Graphics.FromImage(nBmp)
        g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
        g.DrawImage(uSource, New Rectangle(0, 0, uSize.Width, uSize.Height))
    End Using

    uSource = nBmp

End Sub

如果我经常调用此方法,则会遇到Unknown GDI +异常,但不是内存不足异常。 由于GDI +的错误并不总是很清楚,因此我怀疑无论如何内存泄漏,因为TaskManager显示正在使用的RAM数量不断增加。

因此,我想问一下上面的代码是否包含任何缺陷,如果是,则如何消除它们。

我认为我在内存管理方面还算不错,但是位图有时确实使我达到了极限。

谢谢。

1 个答案:

答案 0 :(得分:1)

我认为您遇到的泄漏是在子例程中间将uSource设置为其他值时发生的,虽然可以,但是也可能导致问题。也许比我更懂行的人可以填补vb.net如何处理此问题的空缺。编辑:对此评论的友善评论,ByRef是造成泄漏的原因。自从问问者(Asker)将此标记为有帮助后,我将其余答案保持不变,并且我认为这是很好的常规做法。

使用这种类型的操作时,通常最好使用Function而不是Sub(正如@Reza Aghaei在评论中建议的那样)。

Sub更改为Function,然后在末尾添加as Bitmap以定义返回类型。记住也要更改End标签。您得到:

Public Function ResizeBitmap(ByVal uSource As Bitmap, ByVal uSize As Size) as Bitmap
   '/.../
End Function

这将允许您在(完成)功能中执行以下操作:

Public Function ResizeBitmap(ByVal uSource As Bitmap, ByVal uSize As Size) as Bitmap

   Dim nBmp As New Bitmap(uSize.Width, uSize.Height)

   Using g As Graphics = Graphics.FromImage(nBmp)
      g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
      g.DrawImage(uSource, New Rectangle(0, 0, uSize.Width, uSize.Height))
   End Using

   Return nBmp

End Function

...并根据需要在代码中的其他位置使用Dim bSmall as Bitmap = ResizeBitmap(bBig, New Size(250,250))调整图像大小。