gpt4 book ai didi

oop - Excel VBA : Does destroying a collection of objects destroy every single object?

转载 作者:行者123 更新时间:2023-12-01 19:41:29 26 4
gpt4 key购买 nike

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

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

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

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

销毁此类是否会调用每个对象的析构函数?

最佳答案

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

VBA 在类上使用引用计数器。每次有对该类的引用时,它都会加一;每次销毁引用时,它都会减一。只要 MyCollection 是某种东西并且在范围内,其中包含的每个 MyClass 引用计数器都将至少是一个。如果引用计数器恰好为 1,则销毁 MyCollection 会将每个元素的引用计数器降至零,并且将被垃圾回收。

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

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。一个用于变量,一个用于集合
  • i=2:MyClass1 的 rc 为 1(丢失了 clsMyClass,仍然有集合),MyClass2 的 rc 为 2
  • i=3:MyClass1 仍为 1,MyClass2 降至 1,MyClass3 的 rc 为 2

检查2:

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

关于oop - Excel VBA : Does destroying a collection of objects destroy every single object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5690493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com