【发布时间】:2011-05-06 14:24:04
【问题描述】:
我想验证设置WeakReference 的代码不会意外持有对被引用对象的强引用。 (这里是 an example 说明如何很容易意外地做到这一点。)
这看起来是检查无意强引用的最佳方法吗?
TestObject testObj = new TestObject();
WeakReference wr = new WeakReference(testObj);
// Verify that the WeakReference actually points to the intended object instance.
Assert.Equals(wr.Target, testObject);
// Force disposal of testObj;
testObj = null;
GC.Collect();
// If no strong references are left to the wr.Target, wr.IsAlive will return false.
Assert.False(wr.IsAlive);
【问题讨论】:
-
你不能指望 GC.Collect() 来强制 gc 收集垃圾,这只是一个建议,所以它可能不会删除对象。 Automatic Memory Collection in .Net
-
您介意详细说明一下为什么 GC.Collect() 可能不会破坏符合收集条件的对象吗?
-
显然它强制进入默认模式。只有当它设置为优化模式时才没有,我没有意识到。
-
嗯,这只是 Java 中的一个建议(gc() 方法)。也许我只是认为它会在 C# 中做同样的事情。
-
@BenGribaudo 我看到一个奇怪的行为,如果不是 Assert.False(wr.IsAlive);我使用 if(wr.IsAlive) Console.WriteLine("Memory Leak");我确实看到正在打印“内存泄漏”并验证 testObj 实例在这种情况下不会被垃圾收集,因此会出现错误。我什至添加了 GC.WaitForPendingFinalizers(); GC.Collect();在 GC.Collect() 之后;多于。这仅在检查是否在 Debug.Assert 或 Assert 内时才有效。
标签: c# unit-testing weak-references