Приведет ли одноразовый клон объекта к утечке памяти в C#?

Проверьте этот код:

.. class someclass : IDisposable{
    private Bitmap imageObject;
    public void ImageCrop(int X, int Y, int W, int H)
    {
        imageObject = imageObject.Clone(new Rectangle(X, Y, W, H), imageObject.PixelFormat);
    }
    public void Dispose()
    {
        imageObject.Dispose();
    }
}

Bitmap является ICloneable, IDisposable в C#.

Чтобы избежать утечки памяти, для объекта Disposable обычно используют using, тогда объект будет утилизирован системой автоматически, независимо от того, насколько неправильным был ваш код.

В моем примере я не могу использовать using, так как я не хочу утилизировать объект, он мне понадобится позже (весь класс сам себя утилизирует, так как его IDisposable тоже.

Мой вопрос: у меня есть объект imageObject, затем я использую его метод Clone() клонирую новый объект и отдаю его в переменную старого объекта. Не приведет ли это к тому, что один (либо клонированный, либо исходный) объект уйдет в никуда и никогда не будет утилизирован, утечка памяти.

[EDIT]

Похоже, большинство мнений Clone вызывают дополнительный объект, старый должен быть Dispose()

Вот новый код:

    public void ImageCrop(int X, int Y, int W, int H)
    {
            // We have 1 object: imageObject
            using (Bitmap croppedImage = imageObject.Clone(new Rectangle(X, Y, W, H), imageObject.PixelFormat))
            {
                    // We have 2 objects: imageObject and croppedImage
                    imageObject.Dispose(); // kill one, only croppedImage left
                    imageObject = new Bitmap(croppedImage); // create one, now 2 objects again
            } // the using() will kill the croppedImage after this
            // We have 1 object: imageObject
    }

и он должен быть правильным Dispose the resources.

6
задан Eric Yin 9 January 2012 в 16:26
поделиться