在VB6 / VBA中是否真的需要对象清除/数组释放(优点/缺点?)

我从VB中学到的很多东西都是从静态代码分析(特别是Aivosto的项目分析器)中学到的.它检查的一件事是你是否清除了所有对象和数组.我曾经盲目地这样做,因为PA这么说.但是现在我对VB释放资源的方式了解得更多,在我看来,这些事情应该自动发生.这是VB6之前的遗留功能,还是有理由将对象显式设置为空,并在阵列上使用Erase?
正如我所理解的那样,问题与VB6(及其前身)源于COM及其引用计数垃圾收集系统的事实有关.

例如,想象一下,您从第三方库声明对对象的引用.该对象具有COM引用计数,用于使其保持活动状态并确定何时应该销毁它.当您将其设置为nothing时,它不会被销毁,但是当对象的引用计数达到零时,它不会被销毁.

现在,并非所有COM组件都是用Visual Basic编写的.有些是用C或C编写的.所有语言都不存在结构化异常处理.因此,如果发生错误,则无法保证对象上的引用计数被正确减少,并且已知COM对象的挂起时间比预期的要长.这本身并不是Visual Basic的问题.这是一个COM问题. (而且,您可能会注意到,这就是.NET不使用引用计数的原因.)

这就是Visual Basic开发人员在退出例程之前释放对象引用的过程的原因.你根本不知道你所分配的组件是在底层创建的.但是当你发布它的引用时,你至少会释放你的引用计数.它几乎成了宗教的口头禅.声明,使用,发布.这是COM的做事方式.

当然,在解除引用我在堆栈上声明的变量时,Visual Basic可能会更好或更快.但该死的,我希望看到这些物品被释放是显而易见的.当你试图追踪内存泄漏时,一点点保证会有很长的路要走.

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...