微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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可能会更好或更快.但该死的,我希望看到这些物品被释放是显而易见的.当你试图追踪内存泄漏时,一点点保证会有很长的路要走.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐