Проверете този код:
.. 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
is ICloneable
, IDisposable
in C#.
Освен това избягвайте изтичане на памет, за обект за еднократна употреба обикновено използвайте using
, след което обектът ще бъде изхвърлен от системата автоматично, без значение колко грешен е вашият код.
В моя пример не мога да използвам using
, тъй като не искам да изхвърлям обекта, имам нужда от него по-късно (целият клас ще се изхвърли сам от IDisposable
също.
Въпросът ми е: имам imageObject
обект, след което го използвам Clone()
метод, клонирам нов обект и го давам на старата обектна променлива. Това ще причини ли един (или клонираният, или оригиналният) обект да отиде никъде и никога да не бъде изхвърлен, изтичане на памет.
[РЕДАКТИРАНЕ]
Изглежда повечето мнения са 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
}
и трябва да е правилно Разполагайте с ресурсите.