C# - 可能通过属性中的 new 泄漏内存

本文关键字:new 泄漏 内存 属性 | 更新日期: 2023-09-27 18:36:30

在一些调试过程中,我遇到了如下代码

 public IEnumerable<ISomething> TheSomeThingList
    {
        get
        {
            var somethings = new List<ISomething>();
            // Fill the list by doing some iteration over internal dictionary of dictionaries
            return somethings.AsEnumerable();
        }
    }

现在,在调试期间,我观察到此列表始终保存对象,而对象已从内部字典中删除。由于此列表包含对已删除对象的引用,

这样的代码会导致内存泄漏吗?

如果是,这个问题的解决方案是什么?请注意,我无法更改属性的界面。

我的第一反应是创建一个支持字段集合,并在内部删除发生时将其清除。

更多细节 -

  1. 具有上述属性的类是应用程序级单例(通过 Unity 而不是通过单例模式实现)
  2. 在列表中填写的对象应该在某些操作(例如关闭文档)后进行清理。保留这些对象将不允许对其进行垃圾回收。

C# - 可能通过属性中的 new 泄漏内存

这不是内存泄漏,因为仍然存在对这些对象的"活动"引用。 它们位于该列表中,并且该列表是从该方法返回的。 如果这些对象保持活动状态,则此方法的调用方将访问已删除的对象,这不应该发生。 每当无法再通过根引用访问该列表时,并且如果该列表中的任何项都无法在其他位置访问,则可以对元素和列表进行垃圾回收。

没有泄漏。

这不是内存泄漏,因为有一个IEnumerable仍然具有对对象的引用。 您不希望删除这些对象,因为使用该IEnumerable<ISomething>的人可能会对对象不再有效感到有些惊讶。

无论坚持IEnumerable是什么,都会使对象生存期保持活动状态,您需要找到一种方法来清除内部状态和从属性返回的IEnumerable