В приложении VB6 у меня есть Dictionary, ключи которого - String, а значения - экземпляры настраиваемого класса. Если я вызову RemoveAll() на Dictionary, освободит ли он сначала настраиваемые объекты? Или мне явно нужно сделать это самому?
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
Да, все объекты в Dictionary будут освобождены после вызова RemoveAll(). С точки зрения производительности (как и скорости) я бы сказал, что эти строки, устанавливающие переменные на Nothing, не нужны, потому что код должен сначала найти их на основе имен ключей, тогда как RemoveAll() будет перечислять и выпускать все в одном цикле.
RemoveAll удалит все ассоциации из Dictionary: как ключи, так и значения. Для Dictionary было бы эталонной утечкой сохранять ссылку на значения в Dictionary.
Если нет других переменных, которые ссылаются на элементы в коллекции, эти объекты следует передать сборщику мусора для очистки при следующем запуске GC.
Если вы, например, сделаете это, где sObj является статической переменной где-то, тогда, когда GC будет вызван системой, первый объект будет очищен, а второй, на который все еще ссылается sObj, не будет.
d("a") = New clsCustom
d("b") = New clsCustom code.
sObj = d("b")
d.RemoveAll()
-1 Единственный «Сборщик мусора» в VB6 - это подсчет ссылок.