2013-07-10 41 views
0

所以我有一個代碼,它是這樣的,使用Memory Stream的另一個內存流可以導致內存泄漏嗎?

using (MemoryStream mStream = new MemoryStream()) 
    { 
     MemoryStream fileStream = new MemoryStream(); 
    } 

我分配內存流到他們兩個,且二者的可能非常大。我知道嵌套的內存流只能在using子句中訪問,但是我擔心這是否會導致內存泄漏,或者即使在代碼執行後,這些內存流仍會在內存中。在GB文件上使用它是否安全?

PS:對不起,如果這個問題明顯或愚蠢,我是這個問題上的新手。

回答

2

當使用實現IDisposable應該叫Dispose任何類方法,一旦你完成它,讓它釋放你的程序不再需要的資源。

using關鍵字通過在語句塊末尾的指定對象上調用Dispose來處理。但是隻有指定的對象被處理。因此,在你的情況下,mStream對象將被丟棄,但fileStream對象不會。它將保留在內存中,使用分配的內存空間等,直到垃圾收集器清理它。

雖然垃圾收集器最終妥善處理,但最好儘快處理完成後執行IDisposable的每個對象。 using聲明有幫助,但是有時候會想要繼續使用創建方法範圍之外的對象。例如,如果你想從方法中返回一個MemoryStream,那麼該對象仍然需要在某個點處理。

瞭解您使用哪些類實現IDisposable,並養成處置它們的習慣。它會在以後挽救你的悲傷。

+0

這實際上回答了我的問題。我不需要代碼,因爲我自己知道該怎麼做,我只是想解釋一下這樣做是否明智。 – Nathan

2

要實際部署第二MemoryStream的正確,你需要嵌套您using S:

using (MemoryStream mStream = new MemoryStream()) 
using (MemoryStream fileStream = new MemoryStream()) 
{ 
    … 
} 

無論哪種方式,不過,如果你需要更多的內存,並且沒有留給MemoryStream引用,它將被收回。一次裝修在內存中的一切,而另一方面,僅僅是一個實際的存儲與文件大小的事情......

0

你應該使用:

using (MemoryStream mStream = new MemoryStream()) 
{ 
    //Don't name this a fileStream if it's actually a MemoryStream? 
    using(MemoryStream fileStream = new MemoryStream()) 
    { 
    } 
}