Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.10.05;
Скачать: [xml.tar.bz2];

Вниз

Если вызвать _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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
15-1219000113
Andy BitOff
2008-08-17 23:08
2008.10.05
Компонент реализующий RAMDisk.


15-1218565213
igm
2008-08-12 22:20
2008.10.05
Требуется программист для разовой работы.


15-1218688465
vrem
2008-08-14 08:34
2008.10.05
Это нормально?


1-1198826889
IgorBet
2007-12-28 10:28
2008.10.05
Автоматизация процесса установки компонентов в Delphi


15-1218560762
blackman
2008-08-12 21:06
2008.10.05
Программистская басня от Эдсгера Дейкстры





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский