我创建了一个类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
的消息进行确认。呵呵