我有一个具有底层Stream的CryptoStream。我不能使用using块来释放CryptoStream,因为这也会释放我需要保持开放的底层Stream。解决方案似乎只是简单地忽略CryptoStream,并在需要时处理Stream。但是,保留对CryptoStream的引用并处理它可能很重要,以防止某些资源泄漏?
此外,即使我不处理CryptoStream,如果它超出范围,GC是否会处理它,然后再处理底层的Stream (这还为时过早,因为我仍然需要Stream)?
发布于 2017-08-02 20:27:43
来自CryptoStream.cs (ln 695)
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也不是一种好的做法。终结器应仅用于释放非托管资源。
https://stackoverflow.com/questions/45401733
复制相似问题