Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.05;
Скачать: CL | DM;

Вниз

Если вызвать _var.Destroy, то разве _var не станет равным nil ?   Найти похожие ветки 

 
Terasbetoni   (2008-08-21 20:48) [0]

Здравствуйте. Вот у меня есть объект некоего класса, ссылка на этот объект хранится в переменной _var. Я вызываю _var.Destroy. Теперь объект уничтожен. Но переменная _var всё ещё хранит адрес, но уже, как бы, недействительный. Всегда ли так? Мне раньше казалось, что в данном случае, если через переменную _var вызвать Destroy моего объекта, то _var автоматически заполнится нулями (станет равным nil). Или это можно регулировать как-то с помощью настроек компилятора?


 
Юрий Зотов ©   (2008-08-21 20:55) [1]

Так всегда и было. Переменная _var - это ссылка на объект и сам объект о ней ничего не знает. Как же он при своем разрушении может обнулить то, о чем он не знает? Тем более, что таких ссылок может быть хоть миллион.


 
Pasha L   (2008-08-21 21:03) [2]

хм. Спасибо. Не. Я знал, что объект ничего не знает о своих ссылках. Просто destroy это деструктор, и мож так сделали, что при вызове деструктора через _var, этот самый _var автоматом заполняется нулями.

спасибо за информацию


 
Тын-Дын ©   (2008-08-21 21:05) [3]


> Я знал, что объект ничего не знает о своих ссылках.


Зато о них знает процедура FreeAdnNil.


 
Loginov Dmitry ©   (2008-08-21 21:17) [4]

> этот самый _var автоматом заполняется нулями.


При вызове любого метода значение переменной (в данном случае _var) копируется в регистр EAX, и доступ к этому значению внутри метода осуществляется через переменную Self. Информации о расположении оригинальной переменной на этот момент уже попросту нет, поэтому и обNILить ее нельзя.


 
Юрий Зотов ©   (2008-08-21 21:22) [5]

> 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 ссылок тоже надо обнулять?
 // Да и потом - может, в них уже давно хранится что-то совсем другое.
 



Страницы: 1 вся ветка

Текущий архив: 2008.10.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
15-1218711018
Vlad Oshin
2008-08-14 14:50
2008.10.05
Об именах. Вот зачем так делать, да еще в пример ставить.


2-1219559874
zivan
2008-08-24 10:37
2008.10.05
Сортировка в TTreeView


2-1219849223
Terasbetoni
2008-08-27 19:00
2008.10.05
Вопрос о создании компонента


4-1194272170
kernel
2007-11-05 17:16
2008.10.05
spindown by DeviceIoControl


15-1218549474
Dmitry S
2008-08-12 17:57
2008.10.05
Как выразить битовую операцию or с помощью сложения и умножения?