gpt4 book ai didi

c# - 委托(delegate)会导致内存泄漏吗? GC.TotalMemory(true) 似乎表明如此

转载 作者:可可西里 更新时间:2023-11-01 07:45:29 25 4
gpt4 key购买 nike

代码

using System;
internal static class Test
{
private static void Main()
{
try
{
Console.WriteLine("{0,10}: Start point", GC.GetTotalMemory(true));
Action simpleDelegate = SimpleDelegate;
Console.WriteLine("{0,10}: Simple delegate created", GC.GetTotalMemory(true));
Action simpleCombinedDelegate = simpleDelegate + simpleDelegate + simpleDelegate;
Console.WriteLine("{0,10}: Simple combined delegate created", GC.GetTotalMemory(true));
byte[] bigManagedResource = new byte[100000000];
Console.WriteLine("{0,10}: Big managed resource created", GC.GetTotalMemory(true));
Action bigManagedResourceDelegate = bigManagedResource.BigManagedResourceDelegate;
Console.WriteLine("{0,10}: Big managed resource delegate created", GC.GetTotalMemory(true));
Action bigCombinedDelegate = simpleCombinedDelegate + bigManagedResourceDelegate;
Console.WriteLine("{0,10}: Big combined delegate created", GC.GetTotalMemory(true));
GC.KeepAlive(bigManagedResource);
bigManagedResource = null;
GC.KeepAlive(bigManagedResourceDelegate);
bigManagedResourceDelegate = null;
GC.KeepAlive(bigCombinedDelegate);
bigCombinedDelegate = null;
Console.WriteLine("{0,10}: Big managed resource, big managed resource delegate and big combined delegate removed, but memory not freed", GC.GetTotalMemory(true));
GC.KeepAlive(simpleCombinedDelegate);
simpleCombinedDelegate = null;
Console.WriteLine("{0,10}: Simple combined delegate removed, memory freed, at last", GC.GetTotalMemory(true));
GC.KeepAlive(simpleDelegate);
simpleDelegate = null;
Console.WriteLine("{0,10}: Simple delegate removed", GC.GetTotalMemory(true));
}
catch (Exception e)
{
Console.WriteLine(e);
}
Console.ReadKey(true);
}
private static void SimpleDelegate() { }
private static void BigManagedResourceDelegate(this byte[] array) { }
}

输出

GC.TotalMemory(true)
105776: Start point
191264: Simple delegate created
191328: Simple combined delegate created
100191344: Big managed resource created
100191780: Big managed resource delegate created
100191812: Big combined delegate created
100191780: Big managed resource, big managed resource delegate and big combined delegate removed, but memory not freed
191668: Simple combined delegate removed, memory freed, at last
191636: Simple delegate removed

最佳答案

有趣的案例。这是解决方案:

enter image description here

合并委托(delegate)是纯观察:看起来委托(delegate)对外部是不可变的。但是在内部,正在修改现有的委托(delegate)。在某些情况下,它们出于性能原因共享相同的 _invocationList(针对几个委托(delegate)连接到同一事件的场景进行优化)。不幸的是,simpleCombinedDelegate_invocationList 引用了 bigMgdResDelegate,这导致内存保持事件状态。

关于c# - 委托(delegate)会导致内存泄漏吗? GC.TotalMemory(true) 似乎表明如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10524107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com