从集合和数组中删除的类会发生什么情况



我创建了一个类myClass的多个实例,并将它们存储在一个集合中。我想知道从集合中删除内存中的对象会发生什么。即

Sub createCollection()
Dim c As New Collection
Dim i As Long
For i = 1 To 5
c.Add New myClass
Next i
c.Remove(5) 'remove last item
End Sub

该类是否仍在内存中,从集合中删除它是否会完全删除它,因为它没有在其他任何地方引用?使用公开声明的集合,或者使用不同的 Sub(比如按下按钮(删除项目有什么影响(如果有的话(?

对于数组呢:

Sub createCollection()
Dim a() As myClass
Redim a(1 To 5)
Dim i As Long
For i = 1 To 5
Set a(i) = New myClass
Next i
Redim Preserve a(1 To 4) 'remove last item
End Sub

在 OOP 中,当最后一个引用对象被删除时,它会从内存中删除它。因此,当没有引用ceratin对象时,它将在下次垃圾回收时被删除。在您的情况下,您的数组是一个引用数组,您创建它的方式,它们是唯一的引用。因此,如果删除最后一项,也会删除对此对象的最后一个引用。因此,在下一次垃圾回收中,该对象将从内存中删除。

只要存在对它的引用,对象就会存在。当不存在引用时,对象将从内存中释放。

Dim a As myClass
Set a = New myClass

在这里,a引用了内存中类型为myClass的对象所在的位置。只要此引用存在,对象就会在内存中。

Set a = Nothing

现在,a不引用对象所在的内存位置。当这是最后一个引用时,此对象将被释放。

Dim a As myClass
Dim b As myClass
Set a = New myClass
Set b = a
Set a = Nothing

现在,该对象仍然继续存在,因为在变量b中保留了对它的引用。你仍然可以说例如b.Something = 1000.

Set b = Nothing

现在,如果b中保存的引用是最后一个引用,则可以从内存中删除该对象。

我想知道从集合中删除内存中的对象会发生什么情况

在这种情况下,您可以在稍微修改代码时自己观看。

Sub createCollection()
Dim c As New Collection
Dim i As Long
For i = 1 To 5
c.Add New myClass
c(i).Id = i
Next i
c.Remove (5) 'remove last item
End Sub 

我的类

Private m_id As String
Private Sub Class_Terminate()
MsgBox "Object termination: " & m_id
End Sub
Public Property Let Id(ByVal vNewValue As Variant)
m_id = vNewValue
End Property

对这五个对象的引用保存在集合中。因此,当创建对象时,New运算符返回对内存的引用,并且此引用存储在VBA.Collection中。从集合中删除对象时,该对象将从内存中释放,并且来自Class_Terminate的消息框将确认这一点。方法createCollection完成后,保存对集合的引用的变量c将超出范围,然后可以释放集合,因为不存在对它的其他引用。然后剩下的四个对象也将被释放,这将通过来自Class_Terminate的消息进行确认。呵呵

最新更新