.vbs中的对象以什么顺序被销毁?
也就是说,鉴于这些全局:
Set x = New Xxx Set y = New Yyy
我对以下任何一个的答案感兴趣。
对于在.VBS中实现的类的实例,将按什么顺序调用Class_Terminate
? Cursory戳创build的顺序( 不是相反的顺序!),但这是有保证的吗?
编辑 :我明白,当最后一个对象的最后一个引用释放时,将调用Class_Terminate
。 我的意思是:x和y的排列顺序是怎样的,是有保证的? 为简单起见,假定x和y是对它们各自对象的唯一引用 。
对象的types是否重要? 例如,如果我在.VBS中实现的类与其他COM对象(如Scripting.FileSystemObject
混合在一起。
编辑 :我明白,COM库可能会build立自己的内部循环引用,脚本宿主引擎一无所知; 我有兴趣探索可能会影响第一个问题的答案。
WScript.Quit
? (在后一种情况下,似乎Class_Terminate
仍然在退出之前调用任何未完成的对象,但这些可能会导致错误被报告)。 我可以凭经验find其中一些问题的答案,但我对是否保证 /logging任何问题感兴趣。
即使你只知道一些答案或进一步的相关问题,也要发帖。
我在VBScript中设计和实现了这个功能。
大部分的答案都在我参考的文章中,只是为了澄清:
将按什么顺序调用Class_Terminate?
当最后一个对象的引用被释放时,通常立即调用终结符。 但是,由于循环引用等问题,依靠终止确定性的顺序通常是一个非常糟糕的主意 。
Cursory戳创建的顺序(不是相反的顺序!),但这是有保证的吗?
正如我在我的文章中指出的那样,当发动机关闭时,未终止的对象将被终止。 作为一个实现细节,终止队列按照创建对象的顺序执行。但是,这是一个你不应该依赖的未公开的实现细节。
对象的类型是否重要? 例如,如果我在.VBS中实现的类与其他COM对象(如Scripting.FileSystemObject)混合在一起。
它可以。 那些在不可预知的时间被拆毁的物体中可能会有循环引用。
我正在考虑全球范围内的对象,当程序退出时 – 对于例如功能范围内的对象,它是不同的?
我不明白这个问题。 你能澄清吗?
这取决于退出是正常的,通过例外还是通过WScript.Quit? (在后一种情况下,似乎Class_Terminate仍然在退出之前调用任何未完成的对象,但这些可能会导致错误被报告)。
这很重要,是的。 VBScript不保证终止程序总是运行。 拥有引擎的主机可以通过“不快速”关闭其进程,例如,不能保证干净地关闭引擎。 (如果发生灾难性的失败,这有时是可取的;如果你不知道什么是错误的,那么有时运行终止代码会使问题变得更糟,而不是更好。
Windows脚本宿主确实尝试关闭引擎干净,当退出被调用。
WScript对象何时被销毁?
Windows Script Host进程终止逻辑运行时。
脚本主人是否重要? (wscript.exe vs cscript.exe与任何Web主机引擎被称为)
是的,这可能很重要。
JScript的对象销毁模型与VBScript不同吗?
是的,非常非常。
从我工作期间(2001年以前)开始,JScript“Classic”使用了一个非确定性的标记和清除垃圾回收器,它在脚本对象中处理循环引用,但不处理脚本和浏览器对象之间的循环引用。 更新版本的JScript“Classic”有一个修改过的垃圾收集器,它处理脚本和浏览器对象之间的循环引用(尽管它不一定检测涉及JScript对象和第三方ActiveX对象的循环)。
JScript的IE 9版本有一个完全重写的垃圾回收器,它使用了非常不同的技术; 我跟它的设计师聊了一下,但是我没有足够的技术知识来深入讨论它的特点。
JScript .NET当然使用CLR垃圾收集器。
我能问你为什么关心所有这些东西吗?
另外请注意,十多年来我没有看过这个代码。 以适当的怀疑态度采取这一切。 我的记忆可能是错误的。