2012-07-10 4 views
12

Le code de test qui utilise WeakReference a échoué pour moi en utilisant Mono 2.11.3 (SGen) ainsi que la version stable 2.10.8. Dans un code simple comme ceciétrange comportement WeakReference sur Mono

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

Assert.IsTrue(wr.IsAlive); 

obj = null; 
GC.Collect(); 

Assert.IsFalse(wr.IsAlive); 

la seconde assertion échouera. L'ajout de GC.WaitForPendingFinalizers n'aide pas. Est-ce un bug dans Mono ou dans ma tête? Merci

+1

Si ce bogue dans votre tête, vous pouvez déboguer à distance en attachant PsychicDbg, mais la fin de la session peut s'avérer fatale. – Polyfun

+4

Pertinent: [GC.Collect \ (\) CLR <> Mono différence.] (Http://mono.1490590.n4.nabble.com/GC-Collect-CLR-lt-gt-Mono-difference-td1536244.html) Je perds la compréhension à environ 2/3 de la descente :) – AakashM

Répondre

10

Ce n'est pas un bogue, mais un détail d'implémentation où le CPG Mono se comporte différemment du GC MS. Dans ce cas, puisque vous avez créé l'objet obj dans le même cadre de pile, il arrive qu'il soit maintenu en vie par le code conservateur de balayage de pile. En vrai code (par opposition aux cas de test triviaux comme celui-ci) ce n'est pas un problème. Si pour votre cas particulier, il est, je suggère allouent l'objet et son WeakReference dans une méthode distincte:

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

qui a fait l'affaire, merci – actionresult

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

Doit assurer la méthode Alloc() ne pas être en ligne lors de la compilation

+1

Cette réponse ne répond pas vraiment à la question de l'OP. Pensez à ajouter quelques explications à votre réponse. – Clijsters

Questions connexes