Marshal.Copy时内存泄漏

时间:2014-10-06 02:44:12

标签: c# memory memory-leaks

我注意到我的程序泄漏了内存。所以我使用dotMemory来查找泄漏,看起来这是导致泄漏的函数:

    private void LoadBits()
    {
        // Lock the bitmap's bits.  
        Rectangle rect = new Rectangle(0, 0, bm.Width, bm.Height);
        bmpData = bm.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bm.PixelFormat);
        stride = bmpData.Stride;

        // Get the address of the first line.
        IntPtr ptr = bmpData.Scan0;

        // Declare an array to hold the bytes of the bitmap. 
        byteCount = Math.Abs(bmpData.Stride) * bm.Height;
        bytes = new byte[byteCount];

        // Copy the RGB values into the array.
        System.Runtime.InteropServices.Marshal.Copy(ptr, bytes, 0, byteCount);
    }

这就是我解锁的方法。

    private void SaveBits()
    {
        // Update Stuff
        IntPtr ptr = bmpData.Scan0;

        System.Runtime.InteropServices.Marshal.Copy(bytes, 0, ptr, byteCount);
        bm.UnlockBits(bmpData);
    }

我为这个类实现了IDisposable接口。我在那里调用SaveBits,所以即使我忘记调用SaveBits,GC也应该为我做。 是的,我调用bm.Dispose()并在Dispose方法中将所有内容设置为null。

1 个答案:

答案 0 :(得分:2)

您完成后需要UnlockBits()