|
本帖最后由 hehex 于 2014-7-17 14:01 编辑
这个问题很有趣。
aa 是一个局部变量,里面装的是对象实体的引用。在你执行set aa = createobject("...") 之前,aa 里面的内容是null, 当你执行该语句的时候,该语句在堆(heap) 中开辟一块内存,生成对象实体,然后将对象实体的引用值赋给变量aa, 比如说是该实体的首地址作为一个指针,通常来说我们在VB 里面不叫指针,而是叫对象的引用。
不管叫什么了,我们都可以通过aa 来访问到这个对象的实体。
当一次循环结束,进入下一次循环的时候,再次执行 set aa = createobject("...") 的时候,这时候 aa 里面的内容是上一次循环时堆内存中那个对象实体的引用,现在呢,首先在堆内存里另外建一个对象实体,然后将这个新的内存对象的实体的引用赋给aa。那么原来的堆内存里有的那个对象实体还存在吗?当然存在,只不过无法再访问到了,这是失去引用的堆内存对象实体。简称为内存垃圾,如果内存垃圾不能被自动回收,则该程序在结束前这块内存永远无法再被使用,产生的这种问题学名叫做内存泄漏。
这里,我和学导老师的看法有分歧,VB6(vba 取自vb6) 的内存管理机制是无法自动释放这样失去引用的对象实体的,即无法自动实现垃圾回收,这点与C ,C++ 完全一致。(高版本的vb 的内存管理机制不同,比如vb.net 就可以自动回收这些失去引用的内存了)
再说一下set aa = nothing 语句,set aa = nothing 语句从字面上看是断开aa 与它的实体之间的引用关系,即将aa 的内容恢复为null, 实则不然,这句话是有操作内存的作用的。除断开引用外,还会清除该对象在堆内存中的实体,这就是学导老师提到的降低效率的原因,因为释放内存也是耗费系统资源的。因此个人意见可以把set aa=Nothing 和C++ 的delete 语句,c 的 free 语句联系起来,都是干一样的活。
最后说一下放循环内还是外的问题,关键看你的对象实体有多大,一般情况下不必那么严谨。但是也有意外,我曾经碰到一个极端的求助例子。某网抓程序,网页对象,抓下来一个大概3M ,然后上千页循环读取,没有在循环内set aa = nothing 来释放内存,最后内存泄漏到系统崩溃了。
但是通常情况下,举个例子,一个字典或者几个字典循环嵌套都没有占多大的内存,现在计算机的内存空间足够大,随便折腾,就不值得在循环内一一 set xx = Nothing 来释放了,正如学导老师所言,严重影响执行效率。
|
|