首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在这种情况下,“不处理StreamWriter”会导致memoryLeak吗?

在这种情况下,“不处理StreamWriter”会导致memoryLeak吗?
EN

Stack Overflow用户
提问于 2011-06-01 01:42:37
回答 4查看 2.3K关注 0票数 3

我有如下方法

代码语言:javascript
复制
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,因为调用者应该关闭内部流,这会导致内存泄漏吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-01 02:18:26

只是为了好玩,我打开了反编译器,看看Dispose在StreamWriter上做了什么(认为底层流可能是唯一需要释放的资源)。这就是结果:

代码语言:javascript
复制
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使用的唯一可处置资源。byteBuffercharBuffer字段是数组,encodingencoder不是一次性的,基本Dispose是虚拟的,所以如果不清理它,流是唯一会导致问题的东西。

我认为这也清楚地表明,如果你想记录流的内容,并在结束后将其留在一个可用的状态,那么你最挑衅的就是不关闭想要释放你的StreamWriter,因为这将释放流( Dispose(true))。您还需要确保重置了Stream的位置,因为您无疑会通过读取内容来更改它。当然,这也意味着您可能希望检查流上的CanSeek属性,并确保一旦读取了内容,就能够将位置返回到以前的位置。

票数 5
EN

Stack Overflow用户

发布于 2011-06-01 01:45:03

作为最佳实践,您应该在不再需要它时立即将其关闭。但是,当垃圾收集离开本地函数作用域时,应该将其标记为清除。

票数 0
EN

Stack Overflow用户

发布于 2011-06-01 02:00:52

如果流不再被引用,那么它肯定会被垃圾收集器处理,因为它实现了IDisposable。

让垃圾收集器处理它的问题是,它被处理的时刻不是确定的,并且取决于几个条件。

因此,从理论上讲,它不会导致内存泄漏,但它会使您的应用程序在更长的时间内使用更多的资源,这可能是非常低效的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6191378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档