![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Если вызвать _var.Destroy, то разве _var не станет равным nil ? [D7, XP]
Terasbetoni © (2008-08-21 20:48:00)Здравствуйте. Вот у меня есть объект некоего класса, ссылка на этот объект хранится в переменной _var. Я вызываю _var.Destroy. Теперь объект уничтожен. Но переменная _var всё ещё хранит адрес, но уже, как бы, недействительный. Всегда ли так? Мне раньше казалось, что в данном случае, если через переменную _var вызвать Destroy моего объекта, то _var автоматически заполнится нулями (станет равным nil). Или это можно регулировать как-то с помощью настроек компилятора?
Юрий Зотов (2008-08-21 21:22:00) [1]> Pasha L (21.08.08 21:03) [2]
> Просто destroy это деструктор, и мож так сделали, что при вызове
> деструктора через _var, этот самый _var автоматом заполняется нулями.
Этого сделать невозможно. Маленький пример - и Вы сразу все поймете.
var
_var1, _var2, _var3, ... , _var100: TMyObect;
begin
// Создадим 100 ссылок на один и тот же объект.
_var1 := TMyObect.Create;
_var2 := _var1;
_var3 := _var1;
...
_var100 := _var1;
... // Здесь напишем еще миллион строк кода.
// Уничтожим этот объект через переменную _var1.
_var1.Free;
// Предположим, компилятор умный и переменную _var1 обнулит сам.
// Но откуда он узнает, что остальные 99 ссылок тоже надо обнулять?
// Да и потом - может, в них уже давно хранится что-то совсем другое.
Loginov Dmitry (2008-08-21 21:17:00) [2]> этот самый _var автоматом заполняется нулями.
При вызове любого метода значение переменной (в данном случае _var) копируется в регистр EAX, и доступ к этому значению внутри метода осуществляется через переменную Self. Информации о расположении оригинальной переменной на этот момент уже попросту нет, поэтому и обNILить ее нельзя.
Тын-Дын (2008-08-21 21:05:00) [3]
> Я знал, что объект ничего не знает о своих ссылках.
Зато о них знает процедура FreeAdnNil.
Pasha L (2008-08-21 21:03:00) [4]хм. Спасибо. Не. Я знал, что объект ничего не знает о своих ссылках. Просто destroy это деструктор, и мож так сделали, что при вызове деструктора через _var, этот самый _var автоматом заполняется нулями.
спасибо за информацию
Юрий Зотов (2008-08-21 20:55:00) [5]Так всегда и было. Переменная _var - это ссылка на объект и сам объект о ней ничего не знает. Как же он при своем разрушении может обнулить то, о чем он не знает? Тем более, что таких ссылок может быть хоть миллион.