2011-01-05 56 views
3

我遇到一个常规,做这样的事情:使用未放弃的内存流返回对象会导致内存泄漏?

static public Bitmap byte2bmp(byte[] BitmapData) 
{ 
    MemoryStream ms = new MemoryStream(BitmapData); 
    return (new Bitmap(ms)); 
} 

我担心这可能不是最好的推荐的方法。 ms在这种情况下是否正确处置?

或者将结果分配给临时位图,丢弃流,然后返回临时对象会更好吗?

static public Bitmap byte2bmp(byte[] BitmapData) 
{ 
    MemoryStream ms = new MemoryStream(BitmapData); 
    Bitmap temp=new Bitmap(ms); 
    ms.Dispose(); 
    return (temp); 
} 

我希望“使用”可能会在这种情况下使用的,但我不知道它会表现得正确与否:

static public Bitmap byte2bmp(byte[] BitmapData) 
{ 
    using(MemoryStream ms = new MemoryStream(BitmapData)) 
    { 
    return (new Bitmap(ms)); 
    } 
} 

什么是最有效的/妥善的解决办法?谢谢!

回答

2

对于担心第一种方法将无法显示ms,您是正确的。作为一个良好的做法,您应该始终在实施IDisposable的对象上调用Dispose方法。

我建议采用最后一种方法。即使您在中间返回,您也可以确信using声明将按预期处理该对象。

下面是代码在运行时如何分解:首先,将评估返回表达式,然后try-finally块(其中using statement仅为语法糖)将被执行,最后该方法将返回。

您可能遇到在using声明中返回问题的唯一情况是if you return the variable from the using statement itself。当然,如果您保留对超出using区块范围的变量的任何引用,则会导致问题。

另见:Best practice regarding returning from using blocks

+0

@LukeH:我不知道我明白你的意思。 C#规范指出返回表达式将在处理流对象处理的'finally'块之前被首先评估,所以无论Bitmap构造函数决定做什么都是无关紧要的。 – 2011-01-05 10:21:46

+3

我错了,但不是那样。如果你关闭/处理流,'Bitmap'类*可能会破坏*。来自MSDN:*“您必须保持该流在”Bitmap“的生命周期中保持打开状态。”* http://msdn.microsoft.com/en-us/library/z7ha67kw.aspx – LukeH 2011-01-05 10:25:35

+0

@LukeH:啊,好的。我以前从未注意到这一点。你现在必须相信什么原因不会导致任何问题,并且/或者上述代码的作用不是简单地依赖实现细节? – 2011-01-05 10:25:46