VB6 Коллекции / Ссылки на объекты - PullRequest
0 голосов
/ 25 марта 2011

Мне было интересно, может ли кто-нибудь рассказать, что происходит с памятью, когда происходит следующее:

Dict = New Dictionary --- Col = New Collection
Dict.Add Key, CustomClassOne
Dict.Add Key2, CustomClassTwo
Dict.Add Key3, CustomClassThree
Dict.Remove Key3
At this point is Key3 removed from memory or would I have to Set Dict.Item(Key3) = Nothing to remove it from memory?
Set Dict = Nothing '// will this remove All the above added custom class objects?
Set Col = Nothing '// Same question as above

Тьфу VB, управление памятью .... TY за ваше время, - Остин

Ответы [ 2 ]

2 голосов
/ 25 марта 2011

VB - это счетчик ссылок.

Правила того, когда объект освобожден из памяти, просты ... это происходит, когда больше нет ссылок на этот объект.Каждый раз, когда объект выходит из области видимости (например, конец функции), его счетчик ссылок уменьшается;что, в свою очередь, может привести к тому, что любые объекты, на которые ссылается этот объект, также уменьшат количество ссылок;и если их счетчики ссылок достигают 0, они тоже освобождаются из памяти.

Именно поэтому обычно нет необходимости устанавливать ссылку на объект на Nothing ... это уменьшит его счетчик ссылок, но этотакже происходит, когда он выходит из области видимости.

Итак, чтобы ответить на ваш вопрос:

Dict.Remove Key3 - это все, что требуется для удаления CustomClassThree и Key3 из памяти (если вы недругие ссылки указывают на этот объект).

Set Dict = Ничто не удалит все из памяти, но это произойдет в любом случае, если он выйдет из области видимости (опять же, при условии, что других ссылок на объекты нет.содержит).

Кажется, что Col не имеет большого отношения к другим операторам и будет удален из памяти, когда выйдет из области видимости, без необходимости устанавливать Col = nothing

Примечание:

Цель установки ссылки на ничто действительно полезна, только если у вас есть объекты, которые оба имеют ссылки на каждыйДругой.Посмотрите круговые ссылки для деталей

1 голос
/ 25 марта 2011

В случае экземпляров Scripting.Dictionary и Collection, когда последняя ссылка на объект исчезла, освобождаются ссылки на объекты, которые они содержат.Отмена освобождения самих объектов зависит от того, содержит ли другая переменная ссылку на тот же объект.

Думайте о каждой ссылке как о веревке, удерживающей камень над пропастью.Пока последняя веревка не перерезана, камень не выпадает из существования.

При удалении предмета из Словаря или Коллекции эта веревка обрезается.

...