2017-08-12 73 views
1

我創建了一個類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 

回答

1

只要對象存在某個對象,對象就會一直存在。不存在引用時,該對象將從內存中釋放。

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 

MyClass的類

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的消息進行確認。 HTH

2

在OOP對象被從內存中刪除,當把它最後一個引用被除去。所以,當沒有提到角質對象時,它將在下一次垃圾收集時被刪除。在你的情況下,你的數組是一個引用數組和你創建它的方式,它們是唯一的引用。所以如果你刪除最後一項,你也刪除最後一個對這個對象的引用。所以在下一次垃圾收集時,對象將從內存中移除。

相關問題