为对象清算/阵列释放在VB6 / VBA真的有必要(优点/缺点?)
-
20-09-2019 - |
题
的很多事我已经了解VB我使用静态代码分析学会(特别Aivosto的工程分析)。和东西一一它检查的是你是否清除了所有对象和数组。我以前只是做这种盲目的,因为PA是这么说的。但现在,我知道一点点有关方式VB释放资源,在我看来,这些东西应该自动发生。这是从预VB6的原有功能,或者是有一个原因,你应该明确设置对象回没有和阵列使用擦除?
解决方案
的问题,据我所知,具有与事实VB6(及其前身)具有其在COM根,并尽其引用计数垃圾收集系统。
想象一下,例如,你声明refernece从第三方库的对象。这个对象有既用来保持它活着,并确定何时应该摧毁一个COM引用计数。当您将它设置为Nothing它不被破坏,但是当对象的引用计数为零。
现在,不是所有的COM组件是用Visual Basic编写。有些人用C或C ++。结构化异常处理并没有在所有语言存在。因此,如果发生错误,在对象上的引用计数,但不保证适当减少,以及被称为COM对象的时间比他们的目的是要流连。这不是用Visual Basic,本身有问题。这是一个COM问题。 (而这,你可能会注意到,这就是为什么.NET不使用引用计数。)
这就是为什么Visual Basic开发人员成为了痴迷的程度释放之前退出程序对象的引用。你根本不知道你在分配组件引擎盖下创造。但是,当你释放你参考吧,你至少释放你的引用计数了。它几乎成了一个宗教的口头禅。申报,使用,释放。这是做事情的方式COM。
当然,Visual Basic中可能会在提领我在堆栈上声明的变量会更好或更快。但是该死,我想这是显而易见的,这些对象被释放。有一点保证去,当你试图追查内存泄漏很长的路要走。
其他提示
马特Curland,先进的Visual Basic 6 的作家,谁知道更多关于Visual Basic中比我们不断,认为这是浪费精力。考虑这个报价(P110)的道,这主要是针对Jet数据库引擎的COM数据访问库:
的拆卸代码差的另一个例子。 DAO已关闭方法必须是 所谓正确的顺序,以及 对象必须在被释放 正确的顺序,以及(记录 数据库,例如之前)。这个 单差的对象模型的行为有 导致了误解,认为VB泄漏 内存除非你明确地将所有 局部变量没有设定 的函数的末尾。这是一个 在一个完全错误的观念 精心设计的对象模型。 VB CAN 清除变量在快结束 比你从代码可以分线,和 它会检查变量,即使你 明确地释放你的引用。 你所做的任何努力是重复的。
您已经阅读此 Aivosto网页(从项目分析仪的创造者)?
如果您使用的是静态变量, 它回收内存是很重要的 他们占领了,当你不需要 变量了。有了动态 变量的内存是没有这么多的 的问题,因为他们被摧毁 当过程结束。
在换句话说,你不需要担心如何清除普通,非静态,局部变量。
我总是做了很好的做法,你永远不知道,如果你在一个下降,你的对象没有释放异常可能会做什么。你应该RELASE他们在最后陈述,并确保他们没有使用任何内存,否则你可能会遇到内存泄漏。
我有一个简单的休息时间跟踪系统所在的服务器上保存随机崩溃的内部问题,花了几个星期,以确定它是应该对自己的自毁对象的内存泄漏。我的代码是被扔进一个异常后自己从来没有清理,从而导致服务器(实际的网站,而不是整个服务器)去了。
是,将所有对象为Nothing和清理尽可能多的,你可以。 VB6是臭名昭著的有内存泄漏时不清理你的东西。垃圾收集是子杆在VB6 / VBA。