【发布时间】:2017-02-19 15:08:39
【问题描述】:
我正在尝试编写一个单元测试来测试内存泄漏。 复制步骤:
TestClass test = new TestClass();
WeakReference reference = new WeakReference(test, true);
test = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Debug.Assert(reference.Target == null, "Memory Leak"); // This works
//Replacing the above line with following, I see "Memory Leak" being printed.
if (reference.Target != null)
{
Console.WriteLine("Memory Leak");
}
我添加了一个终结器:
~TestClass() { Console.WriteLine("TestClass instance finalized");}
我注意到终结器在 Assert 案例中作为 GC 命令的一部分被调用,但是当我用 if 条件替换它时,终结器不会作为 GC 命令的一部分被调用,因此引用的目标仍然存在.终结器仅在程序存在之前被调用。
预期行为:
if(reference.Target != null) Console.WriteLine("Memory Leak");
应该可以。
实际行为:
Debug.Assert(reference.Target == null, "Memory Leak");
有效但
if(reference.Target != null) Console.WriteLine("Memory Leak");
打印“内存泄漏”时不起作用
【问题讨论】:
标签: c# .net memory-leaks garbage-collection