|
|
hiyou 发表于 2014-3-7 14:07 
差不多,还有几种情种,有SUB外的准全局变量,不过你应该理解这种东西。
下面这两种是有区别的
假定你引 ...
比如上面的例子:
SUB TEST()
DIM A AS NEW XX
DIM B AS XX
SET B=NEW XX
END SUB
无论A是即时生成也好, B 是后绑定时生成也好。A和B 都是内存中的一个引用,或者换句话说是一个指针指向对象实体,那么这个对象实体在哪里?和A,B 是不在一起的。
众所周知 A,B 属于Sub 内的局部变量,系统开这个Sub 的时候就会在内存中开辟一个栈区(Stack) 这个栈区是随着Sub 的结束而被系统自动回收的这种叫做清栈操作,这是栈的管理特性所致。 而对象实体是开辟在堆内存(Heap)里面的,堆内存中是程序员开辟的,比如前面的New xxx 或者CreateObject (), 这些对于内存来说没分别都是在堆内存中开辟区域生成对象实体。程序员是无法直接操作堆内存的对象实体的,只能通过该实体的引用,即栈中的引用变量A,B来访问对象。当A,B 的生存期结束时,比如执行到End Sub 语句。那么堆内存中的对象实体则将失去引用成为垃圾,只有垃圾收集机制能自动回收这部分内存。支持垃圾回收机制的开发工具很多比如C#,vb.net,Java 等等,很不幸不包含VB。因此为了避免垃圾太多造成的内存泄漏,所以通常都要求程序员在用不到的内存对象变成垃圾之前手动回收它。比如C 语言的 free 语句,C++ 的delete 语句还有VB 的Set xxx= nothing。
所以清除对象实体是与前后绑定无关的,只要在堆内存中产生了对象实体,而在使用完毕后没有及时回收,当它失去引用后就即刻变成了垃圾,而埋下内存泄漏的隐患。 |
|