【发布时间】:2018-04-24 14:43:31
【问题描述】:
我最近一直在使用 DotSpatial 库,并注意到我的程序内存泄漏非常严重。我一直在使用 VS 内存诊断工具,并设法将问题缩小到以下(简化)代码块:
using (var inMemoryStream = new MemoryStream())
using (var _writer = new BinaryWriter(inMemoryStream))
{
WriteHeader(_writer);
_writer.Close();
}
BinaryWriter 对象维护对 inMemoryStream 对象的引用,分配给它的 OutStream 属性。似乎无论使用何种处置方法(使用/关闭/处置),此内存流都不会释放它为其缓冲区分配的内存。
我已经设法通过创建一个继承自 BinaryWriter 的类、覆盖 Close() 并将“OutStream = null”添加到该方法来解决这个问题,但这似乎很笨拙。
我错过了什么吗? BinaryWriter 不应该完全处理传递给它的流吗?似乎 BinaryWriter.Close() 确实尝试对此做一些事情,因为使用智能感知查看 OutStream 的某些属性会显示 ObjectDisposed 异常。我正在使用 .NET 4.5.2,如果这有影响的话。
提前多谢指教
【问题讨论】:
-
MemoryStream在其实现中只是一个原生字节数组。当两者都在using块的末尾超出范围时,它们都将不再有任何引用,并将被垃圾收集器清理。你确定内存泄漏不是来自WriteHeader(_writer)吗? -
想想你的假设。为什么作者要处理作为参考传递给它的流?如果作者不知道的其他对象也持有对流的引用怎么办?
标签: c# .net memory-leaks binaryreader