检查此代码:
.. 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()
方法克隆一个新对象并将其提供给旧对象变量。这是否会导致一个(克隆的或原始的)对象无处可去并且永远不会被处置,内存泄漏。
[编辑]
似乎大多数意见都是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
}
并且应该适当地处置资源。