gpt4 book ai didi

windows - VBScript 中对象的破坏顺序是什么?

转载 作者:可可西里 更新时间:2023-11-01 13:29:05 28 4
gpt4 key购买 nike

.vbs 中的对象以什么顺序销毁?

也就是说,给定这些全局变量:

Set x = New Xxx
Set y = New Yyy

我对以下任何的答案感兴趣。

  1. 对于在 .VBS 中实现的类的实例,将以什么顺序调用 Class_Terminate?粗略的戳按创建的顺序(不是相反的顺序!),但这能保证吗?

    编辑:我知道 Class_Terminate 将在对象的最后一个引用被释放时调用。我的意思是:x 和 y 将以什么顺序发布,是否有保证?为简单起见,假设 x 和 y 是对其各自对象的唯一引用

  2. 对象的类型重要吗?例如如果我在 .VBS 中实现的类与其他 COM 对象混合在一起,例如 Scripting.FileSystemObject

    编辑:我知道 COM 库可能会设置脚本宿主引擎一无所知的内部循环引用;我有兴趣探索什么会影响第一个问题的答案。

  3. 如果 x 和 y 是 Sub 或 Function 的局部而不是全局的,上述问题的答案是否不同?

  4. 是否取决于退出是正常退出、异常退出还是通过WScript.Quit退出? (在后一种情况下,似乎 Class_Terminate 在退出之前仍会在任何未完成的对象上调用,但是这些可能会导致报告错误)。

  5. WScript 对象何时销毁?

  6. 脚本宿主重要吗? (wscript.exe 与 cscript.exe 与 Web 主机引擎的任何名称)

  7. JScript 的对象销毁模型与 VBScript 的不同吗?

我可以根据经验找到其中一些问题的答案,但我感兴趣的是它们中的任何一个是否得到保证/记录。

即使您只知道部分答案或其他相关问题,也请发帖。

最佳答案

我在 VBScript 中设计并实现了这个功能。

大部分答案都在 Mark 引用的我的文章中,但只是为了澄清:

in what order will Class_Terminate be called?

终结器通常在对象的最后一个引用被释放时立即调用。但是,由于循环引用和其他问题,依赖确定性终止顺序通常非常糟糕的想法

Cursory poking suggests in the order (not reverse order!) of creation, but is this guaranteed?

正如我在文章中指出的那样,未终止的对象在引擎关闭时终止。作为实现细节,终止队列按照创建对象的顺序执行。但是,这是一个未记录的实现细节,您不应依赖。

Does the type of object matter? e.g. if I have classes implemented in the .VBS mixed in with other COM objects such as Scripting.FileSystemObject.

可以。那些在不可预测的时间被拆除的对象之间可能存在循环引用。

I'm thinking of objects at global scope, when the program quits - is it different for objects at e.g. function scope?

我不明白这个问题。你能澄清一下吗?

Does it depend on whether the exit is normal, by exception, or via WScript.Quit? (In the latter case, it seems that Class_Terminate is still called on any outstanding objects before exiting, however these may cause an error to be reported).

这很重要,是的。 VBScript 不保证终结器始终运行。拥有引擎的主机可以通过“快速失败”的方式关闭其进程,但不能保证完全关闭引擎,例如. (在发生灾难性故障的情况下,这有时是可取的;如果您不知道哪里出了问题,那么有时运行终止代码会使问题变得更糟,而不是更好。)

当调用 Quit 时,Windows Script Host 会尝试完全关闭引擎。

When is the WScript object destroyed?

当 Windows 脚本宿主进程终止逻辑运行时。

Does the script host matter? (wscript.exe vs cscript.exe vs. whatever the web host engine is called)

是的,这很重要。

Does JScript's object destruction model differ to VBScript's?

是的,非常重要。

JScript“Classic”在我工作期间(2001 年之前)使用了一个不确定的标记和清除垃圾收集器,它确实处理脚本对象之间的循环引用,但不处理脚本和浏览器对象之间的循环引用。 JScript“Classic”的最新版本有一个修改过的垃圾收集器,它确实处理脚本和浏览器对象之间的循环引用(尽管它不一定检测涉及 JScript 对象和第三方 ActiveX 对象的循环。)

JScript 的 IE 9 版本有一个完全重写的垃圾收集器,它使用了非常不同的技术;我和它的设计师聊了一会儿,但我没有足够的技术知识来深入讨论它的特性。

JScript .NET 当然使用 CLR 垃圾收集器。

我能问一下你为什么关心这些东西吗?

另外请注意,我已经有十多年没有看过这段代码了;以适当的怀疑态度对待所有这些。可能是我记错了。

关于windows - VBScript 中对象的破坏顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3728970/

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