Сначала метод Scripting.Dictionary RemoveAll () освобождает все свои элементы? - PullRequest
2 голосов
/ 16 сентября 2008

В приложении VB6 у меня есть Dictionary, ключи которого String s, а значения являются экземплярами пользовательского класса. Если я позвоню 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

Ответы [ 3 ]

4 голосов
/ 16 сентября 2008

Да, все объекты в Dictionary будут освобождены после вызова RemoveAll(). С точки зрения производительности (как в отношении скорости) я бы сказал, что эти строки, устанавливающие переменные в Nothing, не нужны, потому что код должен сначала искать их на основе имен ключей, тогда как RemoveAll() будет перечислять и освобождать все в одном цикле. .

2 голосов
/ 16 сентября 2008

RemoveAll удалит все ассоциации из Dictionary: и ключи, и значения. Для Dictionary было бы справочной утечкой сохранить ссылку на значения в Dictionary.

0 голосов
/ 16 сентября 2008

Если нет других переменных, которые ссылаются на элементы в коллекции, эти объекты должны быть переданы в сборщик мусора для очистки при следующем запуске GC.

Если вы, например, делаете это, когда sObj где-то является статической переменной, то когда система вызывает следующий GC, первый объект будет очищен, а второй, на который все еще ссылается sObj, не будет. *

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

d.RemoveAll()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...