Excel VBA:销毁一个对象的集合是否会销毁每一个对象?

假设我有一个MyClass对象的集合MyCollection

Set MyCollection = Nothing调用每个包含的对象的析构函数,或者我应该照顾设置每个对象= Nothing单独的?

我明显关心内存泄漏的原因。

 Dim MyCollection As Collection Set MyCollection = New Collection ... 'add objects of type MyClass here Set MyCollection = Nothing 

破坏这个类是否调用每个对象的析构函数?

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

VBA在课堂上使用参考计数器。 每次引用类时都会打上一个,每次引用被破坏时都会打上一个。 只要MyCollection是在某个范围内,其中包含的每个MyClass引用计数器都至less有一个。 如果引用计数器恰好为1,则销毁MyCollection会将每个元素的引用计数器打勾为零,并将被垃圾收集。

除非明确将其设置为Nothing,否则子类中间的最后一个MyClassvariables将引用MyClass的一个实例。 一个类variables不可能引起明显的内存问题。

 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 

检查1:

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

CHECK2:

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

简短的答案是肯定的。 在下面的例子中,除了它显示了一个特定的方法,你可能已经创build了MyClass实例之外,它与你非常相似,MyClass的所有单个实例将在集合被销毁后立即销毁:

 Dim MyCollection As Collection Set MyCollection = New Collection Call MyCollection.Add(New MyClass) Call MyCollection.Add(New MyClass) Call MyCollection.Add(New MyClass) Set MyCollection = Nothing 

更长的答案是,这取决于。 如果对包含的对象的唯一引用是集合所持有的对象,那么答案是“是”,这就是您的简单示例中的情况。 VBA会知道你的所有MyClass实例不再被引用到任何地方并销毁它们。 (这将导致对每个对象实例的Class_Terminate方法的Class_Terminate 。)

但是,如果您已经对这些对象进行了其他引用,则必须小心。 语句Set MyCollection = Nothing什么魔力。 事实上这样做会导致VBA破坏集合,从而导致它破坏内部的对象。 (当然,如果MyCollection包含对它的唯一引用,则该集合仅被该行破坏。)

了解更多关于VBA对象生命周期是如何使用旧的“Visual Basic 6.0程序员指南”,特别是“对象引用和引用计数”部分的一个很好的资源:

http://msdn.microsoft.com/en-us/library/aa263495(v=VS.60).aspx