Excel VBA:销毁对象集合是否会破坏每个对象?

Ste*_*e06 9 oop excel vba class

说我有一个MyCollection对象的集合MyClass.

是否Set MyCollection = Nothing调用每个包含对象的析构函数,还是应该= Nothing单独设置每个对象?

我显然关心内存泄漏的原因.

Dim MyCollection As Collection
Set MyCollection = New Collection
... 'add objects of type MyClass here
Set MyCollection = Nothing 
Run Code Online (Sandbox Code Playgroud)

销毁这个类会调用每个对象的析构函数吗?

Dic*_*ika 10

在销毁MyCollection时,所有MyClass对象都将被销毁,除非它们在其他地方被引用.

VBA在课堂上使用参考计数器.每当有一个对类的引用时它会加1,并在每次引用被销毁时向下滴答一个.只要MyCollection是某种东西并且在范围内,其中包含的每个MyClass引用计数器将至少为一个.如果引用计数器正好是一个,则销毁MyCollection会将每个元素的引用计数器打到零,并且它将被垃圾收集.

除非您明确将其设置为Nothing,否则sub中间的最后一个MyClass变量将引用MyClass的一个实例.一个类变量不太可能导致明显的内存问题.

Sub MakeClassColl()

    Dim MyCollection As Collection
    Dim i As Long
    Dim clsMyClass As MyClass

    Set MyCollection = New Collection

    For i = 1 To 3
        Set clsMyClass = New MyClass
        MyCollection.Add clsMyClass
        'Check1
    Next i

    Set MyCollection = Nothing
    'Check2

End Sub
Run Code Online (Sandbox Code Playgroud)

检查1:

  • i = 1:MyClass1(实例1)的引用计数器为2.一个用于变量,一个用于集合
  • i = 2:MyClass1的rc为1(丢失的clsMyClass,仍有集合),MyClass2的rc为2
  • i = 3:MyClass1仍为1,MyClass2降为1,MyClass3的rc为2

CHECK2:

  • 集合中的每个MyClassi实例都会丢弃一个.MyClass1和2归零.MyClass3降为1,因为clsMyClass仍然引用它(我将clsMyClass添加到集合后没有销毁它).