メモリリークをテストするためのユニットテストを作成しようとしています。再現 手順:、WeakReferenceを使用してメモリリークのユニットテスト中に異常な動作が発生しました
~TestClass() { Console.WriteLine("TestClass instance finalized");}
と私はファイナライザがアサート場合にはGCコマンドの一部として呼び出されることに気づいたが、私は、ifの条件に置き換えるとき:
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");
}
私は、ファイナライザを追加しましたファイナライザはGCコマンドの一部として呼び出されないため、参照のターゲットはまだ生きています。ファイナライザは、プログラムが存在する前にのみ呼び出されます。
予想される動作:
if(reference.Target != null) Console.WriteLine("Memory Leak");
動作するはずです。
実際の動作:
Debug.Assert(reference.Target == null, "Memory Leak");
作品が、
if(reference.Target != null) Console.WriteLine("Memory Leak");
は、 "メモリリーク"