如何终止对父类的引用?

Dam*_*Gal 2 excel vba memory-leaks

我发现,如果您在其中引用了parent,则该类不会自动刷新。例如这样的事情:

Private Sub test()
    Dim a As New settings
    Dim b As New Collection
    b.Add a
    Set a = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)

在“设置”类中:

Private SQLSettings As New settingsserver
Private Sub Class_Initialize()
    Me.SQLSettings.Initialize Parent:=Me
    MsgBox "init"
End Sub
Private Sub Class_Terminate()
    MsgBox "terminate"
End Sub
Run Code Online (Sandbox Code Playgroud)

因此,基本上,如果我删除Parent:= Me,它将终止设置类,但是如果我离开它,它将保留在垃圾收集器中。这是为什么?该类有一个引用该类的子类,因此它不刷新整个包吗?如何参考父类自动刷新类?

Mat*_*don 6

没有垃圾收集器,VBA是引用计数的,不是垃圾收集的。

如果对象具有> 0个引用,则该对象不会终止。结果,如果一个或多个子对象正在引用父对象,则使父对象为空不会破坏任何对象。

也没有帮助,Dim...As New创建自动实例化对象 -你要疯狂地避免这种情况。

很难显示出这么少的代码就可以在哪里插入它,但是从根本上讲,您需要先将子对象显式地移到Set Parent = Nothing另一点,然后再尝试使父对象为空。

如果您喜欢冒险,可以使用WeakReferences(免责声明:我写那篇文章)避开这个问题,但这可能有点不稳定或容易崩溃。