1

所以我有一个代码,它是这样的,

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

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

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

4

3 回答 3

2

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

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

但是,无论哪种方式,如果您需要更多内存并且没有对 的引用MemoryStream,它将被回收。另一方面,一次将所有内容放入内存只是实际内存与文件大小的问题……</p>

于 2013-07-10T02:31:47.713 回答
2

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

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

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

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

于 2013-07-10T05:01:00.050 回答
0

你应该使用:

using (MemoryStream mStream = new MemoryStream())
{
    //Don't name this a fileStream if it's actually a MemoryStream?
    using(MemoryStream fileStream = new MemoryStream())
    {
    }
}
于 2013-07-10T02:32:23.680 回答