重复列表会导致内存泄漏吗?

时间:2015-08-27 22:52:33

标签: c# linq list memory-leaks

如果在循环中使用,是否会造成内存泄漏?

mylist = mylist.Distinct().ToList();

如果是这样,如果你只需要更新它(特别是使用LINQ),那么对于列表是一个好的方法,而不是创建一个新的吗?

1 个答案:

答案 0 :(得分:1)

引用的代码行:

mylist = mylist.Distinct().ToList();

将创建List<T>类型的新对象,其中Ttypeof(mylist)

该列表将包含对mylistDistinct()中原始对象的子集(可能全部或无)的引用,如#include <restbed> LINQ运算符所返回。

因此,您在该行代码之后的情况是您拥有原始列表,原始列表中的所有原始对象,以及引用原始对象的某些子集的新列表。

所以是的,你已经使用了更多的内存(但相对来说并不多)。

这本身不是内存泄漏。这取决于你现在对新列表的处理方式。如果你只是将它设置为null,或者它超出范围,那么它通常会被垃圾收集(最终)并且你将获得所有内存;没有泄漏。但是,如果您执行的操作会导致另一个对象保留对列表的引用,那么您可能会发生内存泄漏。

您可能会在不知不觉中持有对新列表的引用的一些方法包括:

  • 一个lambda表达式已关闭&#39; list变量和lambda已传递给另一个对象。然后该列表将具有另一个对象的生命周期,即使它超出了词法范围。
  • 您已订阅另一个对象的活动;另一个对象现在拥有一个引用(通过委托)到您的对象,它将在事件订阅持续存在时保持活动状态。
  • 我确定还有其他人......