内存流在另一个使用内存流的内部,是否会导致内存泄漏?

时间:2013-07-10 02:29:27

标签: c# memory-leaks memorystream

所以我有一个代码,就像这样,

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

我将内存流分配给它们,并且它们都非常大。我知道嵌套的内存流只能在using子句中访问,但是我担心这是否会导致内存泄漏,或者即使代码执行后,这个内存流仍然会在内存中。在GB文件上使用它是否安全?

PS:对不起,如果这个问题很明显或很愚蠢,我就是这个问题的新手。

3 个答案:

答案 0 :(得分:2)

要正确处理第二个MemoryStream,您需要嵌套using s:

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

但是,无论哪种方式,如果您需要更多内存并且MemoryStream没有任何引用,它将被回收。另一方面,将所有内容安装在内存中只是实际内存与文件大小的关系......

答案 1 :(得分:2)

当使用任何实现IDisposable的类时,您应该在完成后立即调用Dispose方法,以允许它释放您的程序不再需要的资源。

using关键字通过在语句块末尾的指示对象上调用Dispose来为您处理此问题。但是只处理了指定的对象。因此,在您的情况下,mStream对象将被释放,但fileStream对象将不会。它将保留在内存中,使用分配的内存空间等,直到垃圾收集器清理它为止。

虽然垃圾收集器最终会处理它,但最好在完成后立即处理实现IDisposable的每个对象。 using语句有帮助,但有时您希望继续使用创建方法范围之外的对象。例如,如果要从方法返回MemoryStream,则仍需要在某个时刻处置该对象。

了解您使用哪些类实现IDisposable,并养成处理它们的习惯。它会在以后拯救你。

答案 2 :(得分:0)

您应该使用:

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