内存不足异常未得到处理

时间:2009-09-04 23:44:35

标签: vb.net memory

我在vb.net中制作的照片编辑器中出现了内存异常。位图图像不断变化,在将其发送到另一个位图之后我总是Dispose()。它是存储在临时文件夹中并耗尽了我在计算机上的所有空间,还是什么?在绘制了大约8个位图后,它总是会出错。

我该如何解决这个问题?这是一个相当严重的问题。

2 个答案:

答案 0 :(得分:2)

处置与记忆无关。内存是一种托管资源,处理非托管资源,如GDI句柄。如果你有一个像字典这样的全局结构或你添加它们的东西,你可能会“泄漏”引用而不允许垃圾收集器找到它们。

在这些情况下,调用GC.Collect()来尝试清理它们通常很诱人。知道这对你没有帮助。如果垃圾收集器能够清理内存,它会。如果要收集的对象仍然在某处,则调用GC.Collect()不会更改内容。


查看评论中的链接,这可能会更好一点(根据链接中的评论改编):

''# Crop a bitmap
<Extension()> _
Public Function Crop(ByVal source As Bitmap, _
       ByVal cropX As Integer, ByVal cropY As Integer, _
       ByVal cropWidth As Integer, ByVal cropHeight As Integer) As Bitmap

    ''# parameter checking/guard clauses
    If source Is Nothing Then Throw New ArgumentNullException()

    If cropX > source.Width Then Throw New InvalidArgumentException("cropX")
    If cropY > source.Height Then Throw New InvalidArgumentException("cropY")

    If cropX < 0 Then cropX = 0
    If cropY < 0 Then cropY = 0

    cropWidth = Math.Min(cropWidth, source.Width - cropX)
    cropHeight = Math.Min(cropHeight, source.Height - cropY)

    ''# Create the new bitmap and associated graphics object
    Dim bmp As New Bitmap(cropWidth, cropHeight)
    Using g As Graphics = Graphics.FromImage(bmp)
        ''# Draw the specified section of the source bitmap to the new one
        g.DrawImage(source, New Rectangle(0, 0, cropWidth, cropHeight), cropX, cropY, cropWidth, cropHeight, GraphicsUnit.Pixel)
    End Using

    ''# Return the bitmap
    Return bmp
End Function 

我认为您的问题在其他地方,但这段代码仍然可能更好一些。

答案 1 :(得分:0)

听起来不像8位图就足以让你的记忆充满。或者他们是巨大的位图?

我发现大多数内存不足的异常实际上都不是内存异常,而是它们在某种程度上是内存损坏的结果。 (我处理了很多非托管代码和PInvokes,所以这对我来说很常见。)

您确定需要处理图像吗?垃圾收集器是否自动处理位图?