Объекты в VB имеют счётчик ссылок. Это означает, что объект хранит количество ссылок на себя. Когда на объект нет ссылок (счётчик = 0), он уничтожается.
При выходе из процедуры, счётчик ссылок уменьшается на единицу — проще говоря — объект автоматически уничтожается. Поэтому в таких случаях нет надобности принудительно объектной переменной (ссылке на объект) присваивать
Nothing.
В других случаях, когда необходимо уничтожить громоздкий объект до выхода из процедуры, это делать обязательно. Ещё это относится к объектам, которые объявлены глобально, так как они могут (и будут) существовать вплоть до завершения программы.
Присвоение ссылке на объект
Nothing не обязательно приведёт к уничтожению объекта, так как необходимо ВСЕ ссылки на этот объект установить в
Nothing. Особенно остро эта проблема возникает с рекурсивными (циклическими) ссылками:
- Код: Выделить всё
Sub Foo()
Dim Token As Object, Phrase As Object
Set Token = CreateObject("Parser.Token")
Set Phrase = CreateObject("Parser.Phrase")
Set Token.Counter = Phrase
...
...
Set Phrase.Builder = Token
...
...
End Sub
При завершении такой процедуры эти объектные ссылки образуют утечку, потому что они ссылаются сами на себя. Невозможно уничтожить ссылку обнулением объектной переменной, тут необходимо зачистить сами свойства.
То есть правильно так:
- Код: Выделить всё
Set Token.Counter = Nothing
Set Phrase.Builder = Nothing
а не
- Код: Выделить всё
Set Token = Nothing
Set Phrase = Nothing
Есть ещё подводный камень при использовании
ключевого слова New в объявлении объектных переменных.
- Код: Выделить всё
Dim Cn As New ADODB.Connection
В таком случае объект создаётся при первом обращении (использовании) к нему, а не там где было использовано ключевое слово New. Присвоение такой ссылке на объект
Nothing может уничтожить его, но он будет создан заново при последующем обращении к нему. Чтобы нечаянно не плодить "зомбоков" лучше не использовать такую форму объявления, а использовать
оператор New, который не обладает таким "воскрешающим" поведением.
- Код: Выделить всё
Dim Cn As ADODB.Connection
Set Cn = New ADODB.Connection