2008-09-16 4 views
2

VB6アプリケーションではのDictionaryがあり、値はカスタムクラスのインスタンスです。 DictionaryRemoveAll()に電話すると、最初にカスタムオブジェクトが解放されますか?または私は明示的にこれを自分で行う必要がありますか?Scripting.DictionaryのRemoveAll()メソッドは、すべての要素を先に解放しますか?

Dim d as Scripting.Dictionary 

d("a") = New clsCustom 
d("b") = New clsCustom 

' Are these two lines necessary? 
Set d("a") = Nothing 
Set d("b") = Nothing 

d.RemoveAll 

答えて

4

はい、Dictionary内のすべてのオブジェクトはRemoveAll()への呼び出しの後にリリースされます。パフォーマンス(スピード)の観点からは、変数をNothingに設定する行は不要であることがわかります。RemoveAll()はすべてを1つのループですべて列挙して解放するのに対して、コードはまずキー名に基づいて検索する必要があるからです。

2

RemoveAllは、すべての関連付けをDictionaryから削除します(キーと値の両方)。 Dictionaryの値への参照を保持するのは、Dictionaryの参照リークです。

0

コレクションのアイテムを参照する他の変数がない場合、これらのオブジェクトはGCを次に実行するときにクリーンアップするためにガベージコレクタに渡す必要があります。

たとえば、sObjが静的変数の場合、システムによってGCが次に呼び出されるとき、最初のオブジェクトはクリーンアップされますが、sObjによって参照される2番目のオブジェクトはクリーンアップされません。

d("a") = New clsCustom 
d("b") = New clsCustom code. 
sObj = d("b") 

d.RemoveAll() 
+1

-1 _VB6_の唯一の "ガベージコレクタ"は参照カウントです。 –

関連する問題