1
3
更新问题的更新答案。 对于新问题,我们将执行以下步骤。
(如果B在第4点最终确定,则有可能在第5点之前收回,因为等待最终确定的B使B和B.a都无法收回,等待最终确定的B.a不影响B的收回)。 所发生的是,在4和5之间的顺序是这样的,B.a被敲定,然后B被敲定。由于WeakReference对对象的引用不是普通的引用,因此它需要自己的清理代码来释放GCHandle。显然,它不能依赖于正常的GC收集行为,因为它引用的全部要点是它们不遵循正常的GC收集行为。 现在B的finalizer已经运行了,但是由于B.a的finalizer的行为是释放它的引用,因此对于IsAlive它返回false(或者在1.1之前的.NET中,如果我记住了正确的版本,则抛出一个错误)。 |
2
2
参考场
在终结器中。这个
潜在的
问题是
所以访问这个对象 完全 是不可靠和脆弱的。终结器应该 只有 与直接值类型state-handles等交谈。任何引用(除非 它将永远活在(被摧毁的物体)应该以不信任的态度对待和避免。
|
3
2
接着我找出了
|
4
1
你不确定。GC可以在不再需要它时立即收集它—在本例中,就是在它被塞进WeakReference之后。 顺便说一句,雷蒙德·陈 blog post 最近关于这个话题。 |
5
1
垃圾收集器已确定
你会发现
|
6
0
尽管
的构造函数
否则,如果您使用的是.NET4.0,则有一个名为
|
savak · 当对象持有对运行线程的引用时,它是否可以进行垃圾回收? 9 年前 |
Sayooj Valsan · 网络回调的弱引用坏主意? 9 年前 |
Hugues BR · 作为iVar的weakSelf 11 年前 |