首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处置CryptoStream还是处置底层流?

处置CryptoStream还是处置底层流?
EN

Stack Overflow用户
提问于 2017-07-30 23:51:56
回答 1查看 717关注 0票数 2

我有一个具有底层StreamCryptoStream。我不能使用using块来释放CryptoStream,因为这也会释放我需要保持开放的底层Stream。解决方案似乎只是简单地忽略CryptoStream,并在需要时处理Stream。但是,保留对CryptoStream的引用并处理它可能很重要,以防止某些资源泄漏?

此外,即使我不处理CryptoStream,如果它超出范围,GC是否会处理它,然后再处理底层的Stream (这还为时过早,因为我仍然需要Stream)?

EN

回答 1

Stack Overflow用户

发布于 2017-08-02 20:27:43

来自CryptoStream.cs (ln 695)

代码语言:javascript
复制
    protected override void Dispose(bool disposing) {
        try {
            if (disposing) {
                if (!_finalBlockTransformed) {
                    FlushFinalBlock();
                }
                _stream.Close();
            }                
        }
        finally {
            try {
                // Ensure we don't try to transform the final block again if we get disposed twice
                // since it's null after this
                _finalBlockTransformed = true;
                 // we need to clear all the internal buffers
                 if (_InputBuffer != null)
                     Array.Clear(_InputBuffer, 0, _InputBuffer.Length);
                 if (_OutputBuffer != null)
                     Array.Clear(_OutputBuffer, 0, _OutputBuffer.Length);

                 _InputBuffer = null;
                 _OutputBuffer = null;
                 _canRead = false;
                 _canWrite = false;
            }
            finally {
                 base.Dispose(disposing);
            }
        }
    }

正如您所看到的,如果您不想处理CryptoStream,则应该调用FlushFinalBlock方法,该方法是公共的。此方法清除输入和输出缓冲区,因此不会在使用的CryptoStream中存储敏感信息。

GC会关闭底层的Stream吗?不是的。为此,必须使用true作为其参数值来调用Dispose方法,但这只在Stream.Close方法中完成(从Stream.Dispose调用)。即使CryptoStream会实现终结器,在执行Finalize时对引用的对象调用Dispose也不是一种好的做法。终结器应仅用于释放非托管资源。

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

https://stackoverflow.com/questions/45401733

复制
相关文章

相似问题

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