如果处理失败,是否有可能永久内存泄漏?

我知道用IDisposible包装每个using对象总是一个好习惯。但是,如果我做不到,是否有可能造成像c ++这样的永久性内存泄漏? (永久性表示应用程序的生命周期)

我知道GC将很难使用COM和本机资源,但假设我仅使用托管代码。没有COM,只有内置软件包和托管代码才没有不安全之处。即使变量超出范围,是否有IDisposible GC无法收集?

sunnisha 回答:如果处理失败,是否有可能永久内存泄漏?

是的。 GC收集对象时,将运行对象的finalizer。在IDisposable的大多数实现中,IDisposable.Dispose()是从终结器调用的,这意味着对象在被垃圾回收时将被处理。

但是,有时并非如此。例如,SharpDX库中的许多对象未在其终结器中处理,因此,如果不处理它们,则它们表示的本机对象(在本例中为图形资源)将不会被清理,您最终会导致内存泄漏。这实际上是我前一段时间this problem的来源。

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

,

是的,有可能。问题的一个常见来源是Timers,如果不处理计时器,它将保留对回调的引用,并使实现回调和所有相关数据的类永久存在。

除未管理的对象外,另一个非常常见的来源是事件注册,如果不使用弱事件模式,则该事件将在dispose方法中未注册。这可能变得非常麻烦,这就是WPF完全依赖弱事件来解决生命周期问题的原因。 WPF Windows没有Dispose方法。生命周期完全由垃圾收集器管理。

反之,如果您正在使用WinForms,您会很快注意到如果忘记在某些窗口上调用Dispose会发生什么情况。

本文链接:https://www.f2er.com/3136026.html

大家都在问