gpt4 book ai didi

vba - 在VB6/VBA中,是否确实需要清除对象/清除数组分配(优点/缺点)?

转载 作者:行者123 更新时间:2023-12-03 23:11:53 25 4
gpt4 key购买 nike

我从使用静态代码分析(尤其是Aivosto的Project Analyzer)中学到了很多有关VB的知识。它要检查的一件事是是否清除了所有对象和数组。我以前只是盲目地这样做,因为PA是这样说的。但是,现在我对VB释放资源的方式有了更多了解,在我看来这些事情应该是自动发生的。这是VB6之前的版本的遗留功能,还是有理由为什么应将对象显式设置为空并在数组上使用Erase?

最佳答案

据我了解,该问题与以下事实有关:VB6(及其前身)起源于COM及其引用计数垃圾收集系统。

例如,想象一下,您从第三方库中声明了对某个对象的引用。该对象具有一个COM引用计数,该引用可用于保持其事件状态并确定何时应销毁它。当您将其设置为Nothing时,它不会被销毁,而是在对象的引用计数达到零时销毁。

现在,并不是所有的COM组件都是用Visual Basic编写的。有些是用C或C++编写的。并非所有语言都存在结构化异常处理。因此,如果发生错误,则不能保证适当减少对象上的引用计数,并且已知COM对象的停留时间比预期的更长。本质上,这不是Visual Basic的问题。这是一个COM问题。 (您可能会注意到,这就是为什么.NET不使用引用计数的原因。)

这就是为什么Visual Basic开发人员沉迷于在退出例程之前释放对象引用的原因。您根本不知道要分配的组件是在后台创建的。但是,当您发布对它的引用时,至少要发布对其的引用计数。它几乎成了宗教的口头禅。声明,使用,释放。这是COM的处理方式。

当然,在引用我在堆栈上声明的变量时,Visual Basic可能会更好或更快速。但是,该死,我希望这些对象已被释放是显而易见的。当您尝试查找内存泄漏时,一点保证就可以走很长一段路。

关于vba - 在VB6/VBA中,是否确实需要清除对象/清除数组分配(优点/缺点)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1525772/

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