15

使用 Mono 2.11.3 (SGen) 以及稳定的 2.10.8 版本测试使用 Wea​​kReference 的代码对我来说失败了。在这样的简单代码中

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

Assert.IsTrue(wr.IsAlive);

obj = null;
GC.Collect();

Assert.IsFalse(wr.IsAlive);

第二个断言将失败。添加 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 回答
5
[MethodImpl((MethodImplOptions.NoInlining)]
static WeakReference Alloc ()
{
    return new WeakReference (new object ());
}

编译时必须确保Alloc()方法不是内联的

于 2017-04-24T09:23:50.070 回答