Я пытаюсь написать модульный тест для проверки утечки памяти. Действия по воспроизведению:
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");}
и я заметил, что финализатор вызывается как часть команд GC в случае Assert, но когда я заменяю его условием 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");
не работает, так как печатает "Memory Leak"