【问题标题】:VB6 Collections/Object ReferencesVB6 集合/对象引用
【发布时间】:2011-03-25 00:49:02
【问题描述】:

我想知道当以下情况发生时,是否有人能说出与记忆有关的情况:

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 给你的时间, - 奥斯汀

【问题讨论】:

    标签: memory object collections vb6 dictionary


    【解决方案1】:

    VB 被引用计数。

    从内存中释放对象的规则很简单。它发生在没有更多对该对象的引用时。每次对象超出范围(例如函数结束)时,它的引用计数就会减少;这可能反过来导致该对象引用的任何对象的引用计数也减少;如果它们的引用计数为 0,它们也会从内存中释放。

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

    所以回答你的问题:

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

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

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

    注意:

    只有当你的对象都相互引用时,设置一个无引用的目的才真正有用。查找循环引用以了解详细信息

    【讨论】:

    • 简单地说设置为 Nothing 没有用,因为在引用变量超出范围之前,您多次重复使用它。表单级集合可用于保存数据或对象的列表,这些数据或对象在卸载表单之前多次重新填充和重新处理不同的数据。您也可能在卸载表单、类等之前很久就“完成”了模块范围的字典/集合。在模块实例的生命周期内依赖所有这些数据并不总是有意义的。对于何时发布引用没有简单的“不费吹灰之力”规则。
    • 我明白你的意思,但我认为很少有表单级集合为了释放内存而设置为空......当然你不会有表单级集合,相反,您将在方法主体中声明它(因此它会超出范围)。将表单级别的集合设置为空可能根本不值得拥有!
    【解决方案2】:

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

    将每个参考视为一根绳索,将岩石固定在深渊之上。在切断最后一根绳子之前,岩石不会消失。

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

    【讨论】:

      猜你喜欢
      • 2010-12-16
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多