内存流内部另一个使用内存流,会不会造成内存泄漏

本文关键字:内存 泄漏 会不会 内部 另一个 | 更新日期: 2023-09-27 18:21:41

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

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

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

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

内存流内部另一个使用内存流,会不会造成内存泄漏

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

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

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

了解使用哪些类来实现IDisposable,并养成处理它们的习惯。它以后会帮你省去悲伤。

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

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

不过,无论哪种方式,如果您需要更多的内存,并且没有对MemoryStream的引用,它都会被回收。另一方面,一次将所有内容放入内存只是实际内存与文件大小的关系…

您应该使用:

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