Безопасное использование Маршала. Копия от необработанных растровых данных до управляемого массива

Я отправил вопрос не на давно о том, как моя программа по существу пропускала память: посмотрите здесь. Я теперь отследил его конкретно к некоторому коду, в котором я копирую необработанные байты Растрового объекта в управляемый массив. Соответствующие нормы:

public class FastBitmap
{
    ...
    private byte[] rgbValues;
    private int height;
    private int width;
    private Bitmap image;

    public FastBitmap(Bitmap plainBitmap)
    {
        width = plainBitmap.Width;
        height = plainBitmap.Height;
        image = new Bitmap(plainBitmap);
        LockPixels(new Rectangle(0, 0, image.Width, image.Height));
    }

    private void LockPixels(Rectangle area)
    {
        if (locked)
            return;
        locked = true;
        BitmapData bitmapData = image.LockBits(area, ImageLockMode.ReadWrite,
                                PixelFormat.Format24bppRgb);
        IntPtr ptr = bitmapData.Scan0;
        int stride = bitmapData.Stride;
        int numBytes = image.Width * image.Height * 3;
        rgbValues = new byte[numBytes];
        for (int r = 0; r < image.Height; ++r)
        Marshal.Copy(new IntPtr((int)ptr + stride * r), 
                             rgbValues, image.Width * 3 * r, image.Width * 3);
    }
}

Таким образом, это - вся степень кода, который вызывает память, не восстанавливаемую, и я предполагаю, что это имеет некоторое отношение к Маршалу. Копия (), хотя я предположил это, так как я копировал с Битового массива (очищенный самостоятельно?) к управляемому массиву, не было никакой проблемы.

Так вопрос: действительно ли необходимо очистить Растровый объект, или через интерфейс IDisposable или через что-то подобное. Что (если существует что-то) является по сути неправильным с использованием Маршала. Копия () в этой ситуации, и где я могу очистить проблему?

Спасибо

Именно так Вы знаете, что я протестировал следующий код, чтобы проверить, что это - действительно это порождение проблемы:

Bitmap bmp = new Bitmap(1000, 1000);
for (int n = 0; n < 100; ++n)
{
   FastBitmap fb = new FastBitmap(bmp);
}

В запуске и конце этой последовательности полное использование памяти увеличилось чем-то как 320 МБ и не уходит, независимо от того, сколько времени Вы ожидаете.

6
задан Community 23 May 2017 в 12:25
поделиться