内存流内部另一个使用内存流,会不会造成内存泄漏
本文关键字:内存 泄漏 会不会 内部 另一个 | 更新日期: 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())
{
}
}