Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание и удаление объектов в Run-time


Саша ©   (2009-06-05 06:51:00) 

Всем привет!

Столкнулся с проблемой, что указатель на экземпляр класса после вызова метода Free продолжает быть ассоциированным с чем-то, т.е. <> nil.

Допустим на форме есть две кнопки:
1. Создать объект

if not Assigned(t) then
t:=TTreeView.Create(self)

2. Удалить объект

if Assigned(t) then
t.free;

Выполняемые действия:
1. Создали объект // все в норме, как и предполагалось
2. Удалить объект // Все нормально, визуально удаляется
3. Пытаемся вновь создать объект, но вот здесь создания не происходит, потому что Assigned(t)<>nil равно как t<>nil.
Почему???
Неужеле в блоке после t.Free нужно каждый раз присваивать t к nill ???Использую "Borland® Delphi® for Microsoft® Windows™ Version 10.0.2151.25345"


Ins   (2009-06-05 12:36:00) [1]

Суровая действительность :D


Dennis I. Komarov   (2009-06-05 12:30:00) [2]


> Free - значит "свободен", так что Free :)

Это только так кажется, а на самом деле Destroy :)


Ins   (2009-06-05 12:24:00) [3]


> Так это уже не "Free" :)


Free - значит "свободен", так что Free :)


Игорь Шевченко   (2009-06-05 11:04:00) [4]

Доктор сказал: "в морг", значит в морг


Dennis I. Komarov   (2009-06-05 10:55:00) [5]

А это уже скорее преобразование типов ;)


Palladin   (2009-06-05 10:52:00) [6]

Скажем так, вознесся или пал. )


Dennis I. Komarov   (2009-06-05 10:51:00) [7]

Так это уже не "Free" :)


Palladin   (2009-06-05 10:41:00) [8]

Угу. Переехал. Вверх или вниз :)


Юрий Зотов   (2009-06-05 10:28:00) [9]

И тут общественность сказала: "Ну вот - ведь можешь, когда захочешь".
:o)


Юрий Зотов   (2009-06-05 10:23:00) [10]

По многочисленным просьбам общественности: хорошо, он не умер. Он переехал в другой город. И там ему стало жить лучше.
:o)


Ega23   (2009-06-05 10:16:00) [11]


> Юрий Зотов ©   (05.06.09 07:11) [5]


Бр-р-р... Аж передёрнулся....


Юрий Зотов   (2009-06-05 08:07:00) [12]

> MsGuns ©   (05.06.09 08:05) [6]

Это всего лишь жизнь...
:o)


MsGuns   (2009-06-05 08:05:00) [13]

Ну и примерчик у Вас, Юрий ;(


Юрий Зотов   (2009-06-05 07:11:00) [14]

> Саша   (05.06.09 06:51)  

Пример "на пальцах". Жил человек. Его телефон был записан в книжках у 100 его друзей. Человек умер. А что стало с записями? Ничего, они остались. А как они могли исчезнуть, если их никто не чистил?


Саша   (2009-06-05 07:10:00) [15]

procedure FreeAndNil(var Obj);
var
 Temp: TObject;
begin
 Temp := TObject(Obj);
 Pointer(Obj) := nil;
 Temp.Free;
end;

Да, собственно ничего волшебного (


Саша   (2009-06-05 07:09:00) [16]

Дохотчиво.
Спасибо!


Юрий Зотов   (2009-06-05 07:05:00) [17]

Есть объект - экземпляр класса TTreeView. На него ссылается переменная t. Об этой переменной объект ничего не знает. На этот же объект могут ссылаться еще хоть 100 переменных, и ни об одной из них он тоже ничего не знает. Объект вообще ничего о ссылках на себя не знает. Он же не может знать что там программист напрограммировал? Не может, естественно.

Объект удаляется - то есть, выполняет цепочку своих методов, начиная с Free. Спрашивается - каким волшебным образом объект может обнулить ссылку на себя, если он об этой ссылке не знает? Тем более, если таких ссылок 100.

Используйте FreeAndNil(t) вместо t.Free. Детали см. в справке.


MBo   (2009-06-05 07:01:00) [18]

>указатель на экземпляр класса после вызова метода Free продолжает быть ассоциированным с чем-то, т.е. <> nil.
Эт нормально

>Неужеле в блоке после t.Free нужно каждый раз присваивать t к nill
FreeAndNil можно использовать при желании

однако многократное использование (классовых) переменных не все считают правильным....


Наверх

Титульная страница Поиск, карта сайта Написать письмо