2013-07-10 61 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()) 
    { 
    } 
}