我有如下方法
public int TranslateOOV(string word, Stream logStream)
{
StreamWriter writer = new StreamWriter(logStream);
//Do some logging
//dont close the writer and leave the caller close the stream
}我没有关闭StreamWriter,因为调用者应该关闭内部流,这会导致内存泄漏吗?
发布于 2011-06-01 02:18:26
只是为了好玩,我打开了反编译器,看看Dispose在StreamWriter上做了什么(认为底层流可能是唯一需要释放的资源)。这就是结果:
protected override void Dispose(bool disposing)
{
try
{
if (this.stream != null)
{
if (disposing || (this.Closable || this.stream as __ConsoleStream))
{
this.Flush(true, true);
if (this.mdaHelper != null)
{
GC.SuppressFinalize(this.mdaHelper);
}
}
}
}
finally
{
if (this.Closable)
{
if (this.stream != null)
{
if (disposing)
{
this.stream.Close();
}
this.stream = null;
this.byteBuffer = null;
this.charBuffer = null;
this.encoding = null;
this.encoder = null;
this.charLen = 0;
base.Dispose(disposing);
}
}
}
}有点冗长,但我认为这告诉我们的是,处理流将处理StreamWriter使用的唯一可处置资源。byteBuffer和charBuffer字段是数组,encoding和encoder不是一次性的,基本Dispose是虚拟的,所以如果不清理它,流是唯一会导致问题的东西。
我认为这也清楚地表明,如果你想记录流的内容,并在结束后将其留在一个可用的状态,那么你最挑衅的就是不关闭想要释放你的StreamWriter,因为这将释放流( Dispose(true))。您还需要确保重置了Stream的位置,因为您无疑会通过读取内容来更改它。当然,这也意味着您可能希望检查流上的CanSeek属性,并确保一旦读取了内容,就能够将位置返回到以前的位置。
发布于 2011-06-01 01:45:03
作为最佳实践,您应该在不再需要它时立即将其关闭。但是,当垃圾收集离开本地函数作用域时,应该将其标记为清除。
发布于 2011-06-01 02:00:52
如果流不再被引用,那么它肯定会被垃圾收集器处理,因为它实现了IDisposable。
让垃圾收集器处理它的问题是,它被处理的时刻不是确定的,并且取决于几个条件。
因此,从理论上讲,它不会导致内存泄漏,但它会使您的应用程序在更长的时间内使用更多的资源,这可能是非常低效的。
https://stackoverflow.com/questions/6191378
复制相似问题