15

Mono 2.11.3 (SGen) と安定した 2.10.8 バージョンを使用して、WeakReference を使用するコードのテストに失敗しました。このような単純なコードで

object obj = new object();
WeakReference wr = new WeakReference(obj);

Assert.IsTrue(wr.IsAlive);

obj = null;
GC.Collect();

Assert.IsFalse(wr.IsAlive);

2 番目のアサートは失敗します。GC.WaitForPendingFinalizers を追加しても役に立ちません。これは Mono のバグですか、それとも私の頭のバグですか? ありがとう

4

2 に答える 2

16

これはバグではなく、Mono GC の動作が MS GC と異なる実装の詳細です。この場合、オブジェクト obj を同じスタック フレームに作成したため、保守的なスタック スキャン コードによってたまたま存続しています。実際のコードでは (このような単純なテスト ケースとは対照的に)、これは問題ではありません。特定のケースである場合は、オブジェクトとその WeakReference を別の方法で割り当てることをお勧めします。

static WeakReference Alloc ()
{
    return new WeakReference (new object ());
}
于 2012-07-11T07:09:00.073 に答える