【问题标题】:Does Scripting.Dictionary's RemoveAll() method release all of its elements first?Scripting.Dictionary 的 RemoveAll() 方法是否首先释放其所有元素?
【发布时间】:2010-09-09 15:42:44
【问题描述】:

在 VB6 应用程序中,我有一个 Dictionary,其键是 Strings,值是自定义类的实例。如果我在Dictionary 上调用RemoveAll(),它会首先释放自定义对象吗?还是我自己明确需要这样做?

Dim d as Scripting.Dictionary

d("a") = New clsCustom
d("b") = New clsCustom

' Are these two lines necessary?
Set d("a") = Nothing
Set d("b") = Nothing

d.RemoveAll

【问题讨论】:

    标签: vb6 memory-management dictionary


    【解决方案1】:

    是的,Dictionary 中的所有对象都将在调用 RemoveAll() 后被释放。从性能(如速度)的角度来看,我会说那些将变量设置为 Nothing 的行是不必要的,因为代码必须首先根据键名查找它们,而 RemoveAll() 将枚举并在一个循环中释放所有内容.

    【讨论】:

      【解决方案2】:

      RemoveAll 将从Dictionary 中删除所有关联:键和值。 Dictionary 保留对 Dictionary 中值的引用将是引用泄漏。

      【讨论】:

        【解决方案3】:

        如果没有其他变量引用集合中的项目,则应将这些对象交给垃圾收集器,以便在下次运行 GC 时进行清理。

        例如,如果您在 sObj 是某处的静态变量的情况下执行此操作,那么当系统下一次调用 GC 时,第一个对象将被清理,但仍被 sObj 引用的第二个对象不会。

        d("a") = New clsCustom
        d("b") = New clsCustom code.
        sObj = d("b")
        
        d.RemoveAll()
        

        【讨论】:

        • -1 VB6 中唯一的“垃圾收集器”是引用计数。
        猜你喜欢
        • 1970-01-01
        • 2016-05-30
        • 1970-01-01
        • 2014-08-13
        • 1970-01-01
        • 2022-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多