在 C++ 中,很容易出现永久性内存泄漏 - 只需分配内存而不释放它:
new char; //permanent memory leak guaranteed
并且该内存在堆的生命周期内保持分配状态(通常与程序运行时持续时间相同)。
在 C# 程序中是否可能出现相同的情况(在内存管理机制正常工作的情况下,将导致特定的未引用对象从未被释放)?
我仔细读过这个问题及其答案,它提到了一些导致内存消耗比预期更高的情况,或者在我看来相当极端的情况,例如终结器线程死锁,但是在具有正常功能的内存管理的 C# 程序中是否可以形成永久泄漏?
这取决于您如何定义内存泄漏。在非托管语言中,我们通常将内存泄漏视为内存已分配但不存在对其的引用的情况,因此我们unable释放它。
这种泄漏在 .NET 中几乎不可能创建(除非您调用非托管代码,或者除非运行时存在错误)。
但是,您可能会遇到另一种“较弱”形式的泄漏:当引用内存时does存在(所以仍然可以找到并重置引用,让GC正常释放内存),但是你thought没有,所以你assumed被引用的对象将被 GC 回收。这很容易导致内存消耗无限增长,因为您正在堆积对不再使用的对象的引用,但这些对象无法被垃圾收集,因为它们仍然在应用程序中的某个地方被引用。
因此,.NET 中通常被认为是内存泄漏的情况只是您forgot您拥有对对象的引用(例如,因为您未能取消订阅事件)。但引用是存在的,如果你记得它,你可以清除它,泄漏就会消失。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)