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

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

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

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

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

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

更多细节-

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

最佳答案

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

没有泄漏。

关于C# - 属性中的 new 可能导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19543565/

相关文章:

c# - 不活动后出现故障的 WCF 双工回调 - 使长时间运行的推送通知保持事件状态

c# - Doxygen C# 代码片段示例生成

c# - 如何在单个存储过程中从多个表中获取数据?

javascript - 即使在删除了 JavaScript 事件处理程序所绑定(bind)的 DOM 元素后,内存中是否仍存在该事件处理程序?

ios - UIImage setImage 崩溃

c# - 翻转/滑动效果与 Winforms

c# - 使用单个 OleDbCommand 类型执行 SELECT、UPDATE、INSERT 和 DELETE 查询

objective-c - ABMultiValueCopyArrayOfAllValues 对象的潜在泄漏

c - 如何在子进程中使用 --leak-check=full 运行 valgrind?

Objective-C 重用 NSString 内存泄漏