【发布时间】:2012-02-05 14:21:04
【问题描述】:
检查此代码:
.. 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 在 C# 中是 ICloneable、IDisposable。
为了避免内存泄漏,对于 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
}
而且应该是适当的处置资源。
【问题讨论】:
-
为什么要复制两次?
标签: c# memory-leaks idisposable using icloneable