2008-09-16 3 views
2

В приложении VB6 у меня есть Dictionary, чьими ключами являются String s, а значения - экземпляры пользовательского класса. Если я позвоню RemoveAll() на Dictionary, он сначала освободит пользовательские объекты? Или я явно должен сделать это сам?Вызывает ли метод Scripting.DictionaryAllAll() все его элементы?

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() будет перечислять и освобождать все в одном цикле.

2

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

0

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

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

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

d.RemoveAll() 
+1

-1 Единственный «сборщик мусора» в _VB6_ - это подсчет ссылок. – 2012-12-30 07:18:26

 Смежные вопросы

  • Нет связанных вопросов^_^