Проверьте этот код:
.. 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.