2011-03-25 112 views
0

我在想,如果有人能告诉至于内存会发生什么,当出现以下情况:VB6集合/对象引用

Dict = New Dictionary --- Col = New Collection 
Dict.Add Key, CustomClassOne 
Dict.Add Key2, CustomClassTwo 
Dict.Add Key3, CustomClassThree 
Dict.Remove Key3 
At this point is Key3 removed from memory or would I have to Set Dict.Item(Key3) = Nothing to remove it from memory? 
Set Dict = Nothing '// will this remove All the above added custom class objects? 
Set Col = Nothing '// Same question as above 

唉VB内存管理.... TY您的时间, - 奥斯汀

回答

1

对于对象的最后一个引用不存在时,使用Scripting.Dictionary和Collection实例都会释放它们保存的对象引用。对象本身是否被解除分配取决于另一个变量是否持有对同一对象的引用。

将每个参考文献想象成一根绳索,在深渊上方保持一块岩石。直到最后一根绳子被切断,岩石才不会失去存在。

删除字典或集合中的项目会削减该绳索。

2

VB是参考计数。

当一个对象从内存中释放时的规则很简单..它发生在没有更多的对象引用时。每当对象超出范围(例如函数的结尾),其引用计数就会减少;这又可能导致该对象引用的任何对象的引用计数也减少;如果它们的引用计数达到0,它们也会从内存中释放。

这就是为什么通常不需要将对象的引用设置为无......这将减少其引用计数,但是当超出范围时也会发生这种情况。

因此,要回答你的问题:

Dict.Remove键3是所有需要从内存中删除CustomClassThree和键3(只要你没有其他的引用指向此对象)。

Set Dict = Nothing将从内存中删除所有内容,但是当它超出范围时再次发生(再次假设没有其他引用指向它所包含的对象)。

上校似乎并不有很多工作要做与其他语句,当它超出范围,而不需要设置列=什么都不会从内存中清除

注:

的目的如果你有两个对象都有引用的对象,那么设置对Nothing的引用才是真正有用的。查找循环引用的详细信息

+0

将设置设置为Nothing并不有用是很简单的,因为在引用变量超出范围之前重新使用引用变量的次数很多。表单级集合可能用于保存数据或对象的列表,这些数据或对象在卸载表单之前会被重新填充并重新处理不同的数据。您也可以在“表单”,“类”等被卸载之前“完成”模块范围字典/集合。在模块实例的生命周期中挂上所有数据并不总是合情合理的。什么时候发布引用没有简单的“不用考虑”规则。 – Bob77 2011-03-25 17:11:00

+0

我明白你的观点,但我认为它很少有一个表单级别的集合,你为了释放内存而设置为无效......当然,你不会有表单级别的集合,而是你可以声明它方法体(因此它会超出范围)。将表单级集合设置为无效可能是一个不值得拥有的集合! – 2011-03-27 01:42:30