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

时间:2013-10-23 13:50:01

标签: c# memory-leaks

在一些调试过程中,我遇到了类似

的代码
 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. 具有上述属性的类是应用程序级单例(通过统一而非单例模式实现)
  2. 在某些操作(例如关闭文档)之后,应该清理列表中填充的对象。抓住这些物体不会让它们被垃圾收集。

2 个答案:

答案 0 :(得分:7)

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

没有泄漏。

答案 1 :(得分:3)

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

持有IEnumerable的是保持对象生命周期活动,你需要找到一种方法来清除内部状态和从属性返回的IEnumerable