所以我有一个代码,就像这样,
using (MemoryStream mStream = new MemoryStream())
{
MemoryStream fileStream = new MemoryStream();
}
我将内存流分配给它们,并且它们都非常大。我知道嵌套的内存流只能在using子句中访问,但是我担心这是否会导致内存泄漏,或者即使代码执行后,这个内存流仍然会在内存中。在GB文件上使用它是否安全?
PS:对不起,如果这个问题很明显或很愚蠢,我就是这个问题的新手。答案 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())
{
}
}