Проверьте этот код:
.. 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
}
и оно должно быть правильным. Утилизировать ресурсы.