2

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

 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();
        }
    }

现在,在调试过程中,我观察到这个列表总是包含从内部字典中删除的对象。由于此列表包含对已删除对象的引用,

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

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

我的第一反应是创建一个支持字段 Collection 并在内部删除发生时清除它。

更多细节 -

  1. 具有上述属性的类是应用程序级别的单例(通过统一而不是通过单例模式实现)
  2. 列表中填写的对象应该在某些操作后被清理(比如关闭文档)。持有这些对象将不允许它们被垃圾收集。
4

2 回答 2

7

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

没有泄漏。

于 2013-10-23T13:54:41.433 回答
3

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

无论是保持IEnumerable对象生命周期处于活动状态,您都需要找到一种方法来清除内部状态和IEnumerable从属性返回的 s。

于 2013-10-23T13:55:22.373 回答