检查这个代码:
.. 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#.
太避免内存泄漏,对于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
}
并且应该适当的处置资源。