首页 > 解决方案 > 如果处理失败,是否有可能发生永久性内存泄漏?

问题描述

我知道IDisposibleusing. 但是,如果我没有这样做,是否有可能像 c++ 那样创建永久性内存泄漏?(永久是指应用程序的生命周期)

我知道 GC 将很难处理 COM 和本机资源,但假设我只使用托管代码。没有 COM,只有内置的包和托管代码没有不安全。IDisposible即使在变量超出范围后,GC 是否也无法收集任何内容?

标签: c#memory-leaksgarbage-collection

解决方案


是的。当 GC 收集到一个对象时,就会运行该对象的终结器。在大多数实现中IDisposableIDisposable.Dispose()从终结器调用,这意味着对象将在垃圾回收时被释放。

但是,有时情况并非如此。例如,SharpDX库中的许多对象都没有在它们的终结器中释放,所以如果你不释放它们,那么它们所代表的本机对象(在这种情况下是图形资源)将不会被清理,你最终会得到内存泄漏。这实际上是我前一段时间遇到的这个问题的根源。

编辑:我没有看到您提到没有非托管资源。在那种情况下,没有。所有不依赖于非托管代码的 C# 代码都必须依赖于 BCL,这不容易造成内存泄漏。


推荐阅读