gpt4 book ai didi

.net - vb.net 中的多个 "= new"具有相同的变量。垃圾收集会处理吗?如何处理?

转载 作者:行者123 更新时间:2023-12-02 06:45:32 25 4
gpt4 key购买 nike

Dim x as whatever

Try

x = new whatever(1)

something is done with x

x = new whatever(2)

something is done with x

Catch

Finally

x.dispose

End Try

x = whatever(1) 会发生什么

垃圾回收是找到指向第一个 new 的指针并销毁它还是什么?

最佳答案

垃圾回收最终会找到旧对象并finalize它。这与处置不完全相同,它要求对象在放置在终结器线程上时能够在额外的 GC 生成中存活下来。 (见下文长篇)

您应该使用不同的变量名(无论如何都是好的做法)并处理两者,或者在用第二个变量覆盖变量之前处理第一个变量。

最好的方法是使用 using statement确保对象确实被处理掉,这样你就根本不需要 try/catch。

Using x as new whatever(1)
something is done with x
End using

Using y as new whatever(2)
something is done with y
End using

[编辑:说来话长。您取消引用第一个 x。然后在将来的某个时候 GC 运行,它检测到第一个 X 没有任何根。如果对象有一个终结器,那么它会在终结器线程上放置一个对该对象的引用 - 请注意,仅仅因为一个对象是一次性的并不一定意味着该对象本身有一个终结器,但对象或子对象中某处的某些东西几乎肯定会有一个。这意味着对象(或子对象)在 GC 运行中幸存下来,因此被提升到第 1 代。然后终结器运行并终结终结器线程上的所有对象,释放它们的非托管内存。然后你必须等待 GC 再次运行,但这次你必须等待第 1 代收集,这种情况要少得多,但当它最终发生时,你的对象最终会被收集]

关于.net - vb.net 中的多个 "= new"具有相同的变量。垃圾收集会处理吗?如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1208791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com