想知道以下情况是否会导致任何内存泄漏。
Aspx页面包含以下内容。
private void Generator(input)
{
using (MemoryStream memoryStream = Helper.Instance.Generate(input))
{
}
}
从aspx页面调用下面的方法,该页面返回内存流。
MemoryStream Generate(input)
{
MemoryStream stream = new MemoryStream();
//doing some stream manipulation here
return stream;
}
答案 0 :(得分:8)
第一点:如果代码抛出异常:
// doing some stream manipulation here
然后Helper.Instance.Generate
不会返回MemoryStream,因此调用者不会处理它。
第二点:MemoryStream
不使用任何非托管资源,因此调用Dispose
并不是必需的。
因此在这种情况下不会有内存泄漏。
如果抛出异常,强制在Helper.Instance.Generate
中使用Dispose可能会更好:
MemoryStream Generate(input)
{
MemoryStream stream = new MemoryStream();
try
{
//doing some stream manipulation here
return stream;
}
catch
{
stream.Dispose();
throw;
}
}
这是构造,操作和返回IDisposable
对象的方法的一般模式。
答案 1 :(得分:0)
这是完全有效的,不会生成内存泄漏,因为在退出using块后会调用Dispose方法。
与执行以下操作完全相同:
private void Generator(input)
{
using (MemoryStream memoryStream = new MemoryStream())
{
Helper.Instance.Manipulate(memoryStream);
}
}
答案 2 :(得分:0)
我认为始终如一地处理MemoryStream
,DataTable
之类的内容是有价值的......这样可以更轻松地读取代码并验证代码是否正确。如果您在using
- 块中看到资源,那么您就知道它是正确的。无需进行心理流量追踪和模拟执行。
可以立即验证代码是否正确。没有想到。我觉得这很好。
那就是说,虽然我试图将不必要的东西放到using
块中,但我并没有过头。如果有理由不处理它(甚至是开发人员的方便),我就是不这样做。
答案 3 :(得分:0)
只有实现对象/类的人无法遵循设计准则并忘记正确编写终结器时,才会发生内存泄漏。
有大量文章和书籍提及细节,例如
http://msdn.microsoft.com/en-us/magazine/cc163392.aspx
http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae