2011-01-05 37 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