我有一个关于通过数组从标准和自定义类中销毁对象的问题,这里是示例:
dim class1 As cClass1
dim class2 As cClass2
dim class3 As cClass3
....
Set class1 = New cClass1
Set class2 = New cClass2
Set class3 = New cClass3
....
使用它们之后我想在最后销毁它们以从内存中释放它们,但我想避免使用它们
Set class1 = Nothing
Set class2 = Nothing
.... 'and so on
我想用以下方法销毁它们:
CRLS Array(class1, class2, class3, "and so on")
这是sub可能会这样做:
Private Sub CLRS(ByRef arr As Variant)
Dim i As Integer
For i = 0 To UBound(arr)
If Not arr(i) Is Nothing Then
Set arr(i) = Nothing
Debug.Print "Deleted" 'it will throw "Deleted" but it will not delete element itself
Else
Debug.Print "not deleted" 'just to see status of element
End If
Next
Erase arr
End Sub
但不幸的是,如果我检查是否"销毁"元素真的是免费的,答案不是,只有所选元素的副本被设置为空。对象作为ByVal传递给数组。
答案 0 :(得分:0)
VBA使用引用计数器销毁对象。当对象引用计数为零时,对象将被销毁。假设您的class1变量通过将其设置为:
来将计数器增加1Set class1 = New cClass1
然后将对象传递给数组。
Array(class1, class2, class3, "and so on")
对象引用计数变为2,因为现在数组有自己的引用。然后将数组引用设置为空,并且计数为1,因为class1仍然具有引用。