2

ここで、探しているものの半分に答えるトピックを見つけました 。Scripting.DictionaryのRemoveAll()メソッドは、最初にすべての要素を解放しますか?

私の場合、値はディクショナリのインスタンスであるため、ディクショナリオブジェクトの階層をネストしました。

私の質問は、各サブディクショナリでRemoveAllを呼び出す必要があるかどうかです。

' just for illustration
Dim d As Dictionary
Set d = New Dictionary

Set d("a") = New Dictionary
Set d("b") = New Dictionary

' Are the next section of code necessary?
' -------------------- section start
Dim key As Variant
For Each key In d
    d.Item(key).RemoveAll
Next
' -------------------- section end

d.RemoveAll
Set d = Nothing
4

3 に答える 3

0

このコードを検討してください

Option Explicit

Private m_cCache As Collection

Private Sub Form_Load()
    ' just for illustration
    Dim d As Dictionary
    Set d = New Dictionary

    Set d("a") = New Dictionary
    Set d("b") = New Dictionary

    d("b").Add "c", 123
    SomeMethod d

    ' Are the next section of code necessary?
    ' -------------------- section start
    Dim key As Variant
    For Each key In d
        d.Item(key).RemoveAll
    Next
    ' -------------------- section end

    d.RemoveAll             '--- d("b") survives
    Set d = Nothing         '--- d survives

    Debug.Print "main="; m_cCache("main").Count, "child="; m_cCache("child").Count
End Sub

Private Sub SomeMethod(d As Dictionary)
    Set m_cCache = New Collection

    m_cCache.Add d, "main"
    m_cCache.Add d("b"), "child"
End Sub

クリーンアップセクションがないと、d( "b")は実質的に変更されません。子が削除されたり、インスタンスが終了したりすることはありません。

于 2012-12-19T10:17:36.703 に答える
0

わかりました、私は私が行った次のテストで自分自身に答えることができると思います。

Sub Main()
  Dim d As Dictionary
  Dim i, j As Integer
  Dim sDummy As String * 10000
  For i = 1 To 1000
    Set d = New Dictionary      ' root dict.
    Set d("a") = New Dictionary ' child dict.
    For j = 1 To 1000
      d("a").Add j, sDummy
    Next j
    'd("a").RemoveAll
    d.RemoveAll
    Set d = Nothing
  Next i
End Sub

コメントアウトしd("a").RemoveAll(私の子辞書)、メモリリークはありません。つまりRemoveAll、ルート(d)を呼び出すだけで十分であり、これが私が知る必要があるすべてです。

于 2012-12-19T21:35:24.773 に答える
0

VB6では、(COMを介した)すべてのオブジェクトが参照カウントの対象となるため、サイクルがない限り、手動で廃棄する必要はありません。

于 2012-12-30T07:06:36.947 に答える