Q. 有没有办法找出一个对象是否对它有任何"强引用"?


Raymond Chen暗示, 一个解决方案可能是可能的:

你想知道参考 计数为零或非零。为了那个, 使用WeakReference。

注意事项

  • 我有一个"弱引用"到对象(使用 弱参考).如果我有一个 强有力的参考 答案马上就会是:"是的。您对该对象有很强的引用。"
  • 垃圾收集器暴露没有答案
  • IsAlive财产 只能告诉你,如果一个对象已经 收集到的, ,或者不是。如果有强烈的引用,或者没有。(没有引用的对象可以不被收集-GC只是还没有得到它)
  • .NET中的对象不引用计数
  • 不是所有的对象都必须包含 可识别的,可识别的 界面
  • 并非所有物品都是我的

代码示例

此代码示例演示了依赖于强制垃圾回收和弱引用的问题 IsAlive 属性,用于确定对象是否对其有任何未完成的引用。

WeakReference m_wr = null;

...

for (int i = 0; i < 1000000; i++)
{
   Pig p = new Pig();
   m_wr = new WeakReference(p);
}

...

GC.Collect();
if (m_wr.IsAlive)
   Environment.FailFast("All objects should have been collected by now");
有帮助吗?

解决方案

不是,不是没有使用调试器API。

就像您说的那样,对象不被引用计数...因此,发现的唯一方法是对堆进行爬网,这通常只是垃圾收集的一部分。

请注意,即使在没有“正常”强引用之后,该对象也可以作为终结的一部分而复活-如果终结器队列具有终结器,则有效地终结器队列对其具有引用。无论如何,在这种情况下,您可能都不希望将该对象包括为“无引用”。

其他提示

第一次打电话 GC.Collect()然后 支票 WeakReference.IsAlive.如果是 true (即打电话后未领取 GC。收集资料)然后在某个地方有一个强有力的参考。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top