弱引用 Bug?

5
[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 版本。
有人能告诉我为什么这个测试失败吗?

编辑:谢谢 stusmith。

你引用了一个字符串, 因为它是一个常量,所以很可能已经被interned(即不是动态分配的),并且永远不会被收集。

就是这样。将第一行更改为

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

测试通过 :-)

1个回答

16

我可以想到两个可能的原因:

  1. 您正在运行调试模式。在调试模式下,引用的生命周期比发布模式长,可能比您想象的要长。
  2. 您有一个对字符串的引用,由于它是常量,很可能被汇编(即不是动态分配的)并且永远不会被回收。

你可以通过将弱引用更改为 this 来验证第二个。 var wr = new WeakReference(new Random().Next(50).ToString()); 然后你会看到测试通过。 - mhoward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接