2012-07-10 8 views
12

安定版2.10.8と同様にMono 2.11.3(SGen)を使用してWeakReferenceを使用するテストコードが失敗しました。このような単純なコードでは、Monoでの奇妙な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か私の頭の中のバグですか? ありがとう

+1

をコンパイル時にインラインではないAlloc()方法を確認する必要がありますPsychicDbgを添付してリモートデバッグすることは可能ですが、セッションを終了することは致命的かもしれません。 – Polyfun

+4

関連性:[GC.Collect \(\)CLR <>モノ差異](http://mono.1490590.n4.nabble.com/GC-Collect-CLR-lt-gt-Mono-difference-td1536244.html )私は道の2/3についての理解を失う:) – AakashM

答えて

10

これはバグではありませんが、Mono GCがMS GCとは異なる動作をする実装の詳細です。この場合、オブジェクトobjを同じスタックフレームに作成したので、控えめなスタックスキャンコードによって生き残ることになります。 実際のコードでは(このような簡単なテストケースとは対照的に)、これは問題ではありません。 それはあなたの特定のケースのために、私はオブジェクトと別の方法でその弱い参照配分を提案した場合:

static WeakReference Alloc() 
{ 
    return new WeakReference (new object()); 
} 
+0

トリックをした、ありがとう – actionresult

0
[MethodImpl((MethodImplOptions.NoInlining)] 
static WeakReference Alloc() 
{ 
    return new WeakReference (new object()); 
} 

すると、それはバグであれば

+1

この答えは実際にOPの質問に答えるものではありません。あなたの答えにいくつかの説明を加えることを検討してください。 – Clijsters