C# BinaryWriter 内存泄漏

标签 c# .net memory-leaks binaryreader

<分区>

我最近一直在使用 DotSpatial 库,发现我的程序内存泄漏非常严重。我一直在使用 VS 内存诊断工具,并设法将问题缩小到以下(简化的)代码块:

using (var inMemoryStream = new MemoryStream())
using (var _writer = new BinaryWriter(inMemoryStream))
{
    WriteHeader(_writer);
   _writer.Close();
}

BinaryWriter 对象维护对分配给它的 OutStream 属性的 inMemoryStream 对象的引用。似乎无论使用何种处置方法(使用/关闭/处置),此内存流都不会释放为其缓冲区分配的内存。

我设法通过创建一个继承自 BinaryWriter 的类、覆盖 Close() 并向该方法添加“OutStream = null”来解决这个问题,但这看起来很笨拙。

我错过了什么吗? BinaryWriter 不应该完全处理传递给它的流吗?似乎 BinaryWriter.Close() 确实尝试为此效果做一些事情,因为使用智能感知查看 OutStream 的某些属性会显示 ObjectDisposed 异常。如果这有所不同,我正在使用 .NET 4.5.2。

提前多谢指教

最佳答案

您似乎认为 Dispose 意味着“清理引用”。有时可能是这种情况,但 Dispose 的实际目的是释放非托管资源。虽然有许多滥用 Dispose 用于其他目的(感谢方便的 using 语法等),但您不应该期待更多。

关闭文件就是释放非托管资源。关闭数据库连接正在释放非托管资源。摆脱对另一个托管对象的引用?为什么您会期望它作为 Dispose 的一部分发生?在丢弃引用之前调用 Dispose - 无论如何之后都不能重用它,不能以任何方式使用已处理的对象。

诚然,在某些情况下这会导致内存泄漏。但在那种情况下,内存泄漏一直一直存在 - Dispose 只能让它变小。现在这本身是值得的,当然 - 但解决方案仍然只是解决问题并释放引用,而不是试图找到减少泄漏资源量的方法。

关于C# BinaryWriter 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50004525/

相关文章:

.net - JSON Outline 工具未出现在 VS 2015 或 2017 中

c# - 单元测试抛出 "System.NullReferenceException",使用 Moq 和 Nunit

c# - 从数组偏移量中获取连续的 n 个值

c# - 如何在 Windows Phone 8.1 中获取屏幕分辨率(宽度和高度)?

ios - 如何解决 iOS 中的此警告?内存泄漏

c# - ID一次性 : Memory leaks

c# - 将多个整数打包和解包到 Uint64 中或从 Uint64 中解包

c# - 延迟 ContinueWith 不起作用

c# - lambda WHERE 子句中的空值

debugging - 有没有办法知道谁拥有对 Go 中对象的引用?