2008-10-16 4 views
4
[TestMethod] 
public void Memory() 
{ 
    var wr = new WeakReference("aaabbb"); 
    Assert.IsTrue(wr.IsAlive); 
    GC.Collect(); 
    GC.Collect(); 
    GC.Collect(); 
    GC.Collect(); 
    GC.Collect(); 
    Assert.IsFalse(wr.IsAlive); //<-- fails here 
} 

Это .NET 3.5 SP1
Может ли кто-нибудь сказать мне, почему этот тест не удается?Ошибка WeakReference?

Редактировать: Спасибо stusmith

У вас есть ссылка на строку, которой, поскольку она является постоянным, это вероятно интернированы (т.е. не динамически выделено), и никогда не будет собрано ,

Все было. Измененный первую строку

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

и тест проходит :-)

ответ

16

я могу думать о двух возможных причин с верхней части моей головы:

  1. Вы выполняющихся в отладке. Ссылки в отладочной версии дольше, чем в релизе, и, возможно, дольше, чем вы думаете.
  2. У вас есть ссылка на строку, которая, поскольку она является константой, вероятно, интернирована (т.е. не динамически распределена) и никогда не будет собрана.
+0

вы можете проверить вторую, изменив слабую ссылку на это. var wr = new WeakReference (new Random(). Далее (50) .ToString()); Затем вы увидите пробный пропуск – mhoward 2015-04-01 19:00:42