В последнее время я столкнулся с вопросом, который заставил меня задуматься; это делало меня занятым, и я не мог найти прозрачного объяснения этому в сети.
Это связано с уничтожением объектов Excel (которые я использую все время и никогда не подвергался допросу раньше).
Предыстория, ведущая к моему вопросу:
С помощью обычных объектов вы можете создать объект, используя ключевые слова SET и NEW.
Например:
Set classInstance = New className
Всякий раз, когда мы создаем этот способ, объект создается в памяти кучи, а счетчик ссылок увеличивается на 1.
В случае, если я не добавлю больше ссылок, следующий оператор вернет счетчик ссылок к нулю:
Set classInstance = Nothing
Когда счетчик ссылок переходит в 0, объект уничтожается и очищается от памяти, а точка "classInstance" указывает на.
Что я читал:
Когда мы используем функцию CREATEOBJECT, она возвращает ссылку на объект COM.
Set oApp = CreateObject("Excel.Application")
Даже если бы мы могли сказать:
Set oApp = nothing
Счетчик ссылок объектов будет равен 0, а oApp больше не будет указывать на объект.
Мои вопросы:
1) Почему этот тип объекта требует вызова метода .Quit перед тем, как объект фактически удаляется из памяти?
То же самое происходит при добавлении ссылки на объект рабочей книги (workbooks.add или workbook.open), который требует метода .close.
Почему эти объекты не могут быть автоматически уничтожены при приведении счетчика ссылок в ноль?
Например, когда мы говорим:
set oRange = nothing
2) И нужно ли говорить:
oApp.Quit
set oApp = nothing
Так как объект приложения уже очищен от памяти при применении .Quit, объект больше не будет выпущен.
Единственная причина, по которой я мог бы придумать, почему oApp будет настроен на Nothing после Quit, будет потому, что он может указывать на неиспользуемую ячейку памяти (в куче) и позже может привести к путанице, если эта память будет повторно назначена (хотя в VBA мне это трудно представить).
Я спрашивал себя, правильно ли это заключение, и я хотел бы получить подтверждение от этого, кто знает ответ.
Пожалуйста, скажите мне, если я вижу это неправильно.
3) То, что они называют в VBA "ссылкой на объект" (например, oApp в коде выше), я вижу их как переменные указателя в C. Было бы безопасно использовать это утверждение или снова, я вижу это неправильно?
Как правило, не сложно применить .Quit и установить ничего, но было бы неплохо получить точную информацию по этой теме. Так что я знаю на 100%, почему я это делаю.