Memory VB6集合/对象引用

Memory VB6集合/对象引用,memory,object,collections,vb6,dictionary,Memory,Object,Collections,Vb6,Dictionary,我想知道,当以下情况发生时,是否有人能告诉我记忆发生了什么: 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 = 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
Ugh VB内存管理。。。。谢谢你的时间,
-Austin

使用Scripting.Dictionary和Collection实例当对对象的最后一次引用消失时,它们所持有的对象引用将被释放。对象本身是否被解除分配取决于另一个变量是否持有对同一对象的引用

把每一个参照物想象成一根绳子,把一块岩石固定在深渊之上。在最后一根绳子被割断之前,岩石不会消失


从字典或集合中删除一个项会切断这条绳子。

同时使用脚本。字典和集合实例当对对象的最后一次引用消失时,它们所持有的对象引用将被释放。对象本身是否被解除分配取决于另一个变量是否持有对同一对象的引用

把每一个参照物想象成一根绳子,把一块岩石固定在深渊之上。在最后一根绳子被割断之前,岩石不会消失


从字典或集合中删除一个项目会切断这一根绳子。

VB是引用计数

从内存中释放对象的规则很简单。。当不再引用该对象时,就会发生这种情况。每次对象超出范围(例如函数结束)时,其引用计数都会减少;这可能反过来导致该对象引用的任何对象的引用计数也减少;如果它们的引用计数达到0,它们也将从内存中释放

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

所以要回答你的问题:

Dict.Remove Key3是从内存中删除CustomClass3和Key3所需的全部内容(只要您没有指向此对象的其他引用)

Set Dict=Nothing将从内存中删除所有内容,但当它超出范围时,无论如何都会发生这种情况(再次假设没有其他引用指向它包含的对象)

Col似乎和其他语句并没有太大关系,当它超出范围时,将从内存中删除,而无需设置Col=nothing

注:


将引用设置为nothing的目的只有在对象都相互引用时才真正有用。查找循环引用以了解详细信息

VB是引用计数

从内存中释放对象的规则很简单。。当不再引用该对象时,就会发生这种情况。每次对象超出范围(例如函数结束)时,其引用计数都会减少;这可能反过来导致该对象引用的任何对象的引用计数也减少;如果它们的引用计数达到0,它们也将从内存中释放

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

所以要回答你的问题:

Dict.Remove Key3是从内存中删除CustomClass3和Key3所需的全部内容(只要您没有指向此对象的其他引用)

Set Dict=Nothing将从内存中删除所有内容,但当它超出范围时,无论如何都会发生这种情况(再次假设没有其他引用指向它包含的对象)

Col似乎和其他语句并没有太大关系,当它超出范围时,将从内存中删除,而无需设置Col=nothing

注:


将引用设置为nothing的目的只有在对象都相互引用时才真正有用。查找循环引用以了解详细信息

简单地说,设置为Nothing(无)是没有用的,因为在引用变量超出范围之前,您会多次重复使用引用变量。表单级集合可用于保存数据或对象的列表,这些数据或对象在卸载表单之前多次针对不同的数据重新填充和重新处理。在卸载表单、类等很久之前,您还可以“完成”模块作用域词典/集合。在模块实例的生命周期中保留所有这些数据并不总是有意义的。对于何时释放引用没有简单的“无脑”规则。我明白你的意思,但我认为很少有表单级集合设置为零以释放内存。。。当然,您不会有表单级集合,而是在方法体中声明它(因此它将超出范围)。将表单级集合设置为nothing可能是一个根本不值得拥有的集合!简单地说,设置为Nothing是没有用的,因为在引用变量超出范围之前,您会多次重复使用它。表单级集合可用于保存数据或对象的列表,这些数据或对象在卸载表单之前多次针对不同的数据重新填充和重新处理。在卸载表单、类等很久之前,您还可以“完成”模块作用域词典/集合。在模块实例的生命周期中保留所有这些数据并不总是有意义的。对于何时释放引用没有简单的“无脑”规则。我明白你的意思,但我认为很少有表单级集合设置为零以释放内存。。。当然,您不会有表单级集合,而是在方法体中声明它(因此它将超出范围)。将表单级集合设置为nothing可能是一个根本不值得拥有的集合!