首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >List<T>排序内存泄漏

List<T>排序内存泄漏
EN

Stack Overflow用户
提问于 2015-07-27 09:59:05
回答 2查看 657关注 0票数 2

如何在.NET中排序通用列表时修复内存泄漏?

代码语言:javascript
复制
private void ManageXmlIndex(XmlDocument xmlDocIndicatorIndex)
{
    indexList = repoManager.ParseIndex(xmlDocIndicatorIndex);
    indexList.Sort((x, y) => y.Created.CompareTo(x.Created));
    view.UpdateIndex(indexList);
}

当我使用linq OrderBy时,也会发生同样的情况。

定制比较功能能解决问题吗?

错误发生的原因是List.Sort。当我注释掉Sort行时,bug就消失了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-27 10:48:27

你看到的不是记忆泄露。这只是编译器将Comparison<IndicatorPropReport>缓存为调用站点上的static委托的方式,从而省去了为每次调用创建一个实例的需要。

如果您查看这个简化的示例:

代码语言:javascript
复制
var ints = new List<int> { 3, 2, 1, 8, 5 };
ints.Sort((x, y) => x.CompareTo(y));

并查看编译器使用.NET反编译器生成的内容:

代码语言:javascript
复制
[CompilerGenerated]
private static Comparison<int> CS$<>9__CachedAnonymousMethodDelegate2;

public static void Main(string[] args)
{
    List<int> ints = new List<int> { 3,2,1,8,5 };
    List<int> arg_51_0 = ints;

    if (Program.CS$<>9__CachedAnonymousMethodDelegate2 == null)
    {
        Program.CS$<>9__CachedAnonymousMethodDelegate2 = 
                new Comparison<int>(Program.<Main>b__1);
    }
    arg_51_0.Sort(Program.CS$<>9__CachedAnonymousMethodDelegate2);
}

[CompilerGenerated]
private static int <Main>b__1(int x, int y)
{
    return x.CompareTo(y);
}

您可以看到,Comparsion<int>被缓存为static委托。同样的行为是在方法调用中发生的。

注意,这种行为是pre的。通过创建一个显示类而不是静态委托来Roslyn changes the way delegates are cached,即使在没有捕获变量的情况下也是如此。

票数 2
EN

Stack Overflow用户

发布于 2015-07-27 10:10:19

我从微软支持处找到了一个答案:

List<T>在其静态构造函数中创建一个空的T数组。该数组存储在List<T>的静态字段中,因此它将处于活动状态,直到AppDomain死亡。所以,不是内存泄露。

来源:https://social.msdn.microsoft.com/forums/vstudio/en-US/dee3c1ee-fb63-43f1-88be-413136afe3ed/memory-leak-in-generic-collection

我希望这能支持你的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31650128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档