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