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

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

Почему Free не делает nil объекту?


Kolan ©   (2007-09-21 17:06:00) 

Здравствуйте,
 Часто задаю себе этот вопрос, когда попадаюсь на том, что Assigned срабатывает так как Объект не nil, и выскакивает AV, так как ему сделали Free.


Сергей М.   (2007-09-21 18:50:00) [1]


> Почему Free не делает nil объекту?


Потому что объекту нельзя "сделать nil".


Kolan   (2007-09-21 18:12:00) [2]

> каким волшебным образом объект при своем разрушении может
> определить, что на него ссылаются именно 3 переменные и
> узнать адреса этих переменных

Да, теперь я понял свою ошибку. Выходит без Notificationмеханизма не обойтись…

Благодарю.


Юрий Зотов   (2007-09-21 18:10:00) [3]

> Kolan ©   (21.09.07 17:29) [4]

> почему Free не работает как FreeAndNil?

Потому что объект не может знать ссылок на себя, чтобы очистить их.

var
 a, b, c: TObject;
begin
 a := TObject.Create;
 b := a;
 c := a;
 a.Free;
end;

Вопрос: каким волшебным образом объект при своем разрушении может определить, что на него ссылаются именно 3 переменные и узнать адреса этих переменных, чтобы прописать в них nil?

Даже если написать FreeAndNil(a), то очистится только переменная A, а переменные B и C окажутся битыми ссылками. Потому что функция FreeAndNil тоже не может определить ВСЕ ссылки на объект и узнать адреса ВСЕХ этих ссылок. Она знает только одну - ту, которую ей передали.

Желать такого - все равно, что желать, чтобы в момент смерти человека его телефон автоматически вычеркивался из всех записных книжек, в которых он был записан.


Leonid Troyanovsky   (2007-09-21 18:07:00) [4]


> Kolan ©   (21.09.07 17:58) [12]

> А где это написано? Особенно интересно прочесть про то почему
> он должен это делать?

Понятие "один - много", мне здесь сложно объяснить :)

Еще раз, медленно: обниление одной ссылки никак
не гарантирует, что у кого-то в закромах не осталось
невалидной, со всеми вытекающими.

> И кроме того при том же Notification объект не сам заботится
> о валидности. Объект, который контролирует объект посылает
> сообщения

RTFM: Notification.
Но, с другой стороны, конечно, это всего лишь Notification.
Хозяин-барин.

--
Regards, LVT.


Kolan   (2007-09-21 18:01:00) [5]


> Я б наставил еще и «!»
> Но, ты их пугаешься :)


Да Ega крикнул, я чуть со стула не упал… мотр прихватило…


Kolan   (2007-09-21 17:58:00) [6]

> До просветления.


А где это написано? Особенно интересно прочесть про то почему он должен это делать?

И кроме того при том же Notification объект не сам заботится о валидности. Объект, который контролирует объект посылает сообщения, а без это го сообщения о валидностине позаботишься…


Leonid Troyanovsky   (2007-09-21 17:50:00) [7]


> Kolan ©   (21.09.07 17:48) [10]

> Значит, делай подобный механизм собс-ручно.
> Я че его делать? FreeAndNil уже есть

RTFM [3].
До просветления.

Я б наставил еще и "!"
Но, ты их пугаешься :)

--
Regards, LVT.


Kolan   (2007-09-21 17:48:00) [8]

> Вобще-то в учебниках по Dlphi написано что нельзя обращаться
> к еще не созданному и уже удаленному объекту,
> Можешь вместо бабок ему указать на учебник.

Да этот нерадивый программист — я. Просто иногда разрушается в одном месте а проверка эта совсем в другом…

Значит, делай подобный механизм собс-ручно.
Я че его делать? FreeAndNil уже есть. Только вот если бы его можно было принудительно использовать…


Leonid Troyanovsky   (2007-09-21 17:44:00) [9]


> Kolan ©   (21.09.07 17:36) [6]

> Про такой механизм знаю. А что если у меня наследники TObject?

Значит, делай подобный механизм собс-ручно.

> Я просто не пойму почему там нет этой проверки? Причина
> какая?

Зачем плодить сущности сверх необходимого?
Если тебе понадобился Notification, возможно,
чтои еще чего-то пригодится от TComponent.

--
Regards, LVT.


Leonid Troyanovsky   (2007-09-21 17:37:00) [10]


> Kolan ©   (21.09.07 17:30) [5]

> Правильно. Держит ссылки список допустим с OwnsObjects.
> Список уничтожили

Ну, для этого есть Owner (Parent).
Т.е., дельфийский Т. Бульба, сирот не оставляющий.

--
Regards, LVT.


stanislav   (2007-09-21 17:37:00) [11]

Kolan ©   (21.09.07 17:29) [4]
>И один из этих всех пишет код:
Вобще-то в учебниках по Dlphi написано что нельзя обращаться к еще не созданному и уже удаленному объекту,
Можешь вместо бабок ему указать на учебник.
А в функции можно предусмотреть  Try Except


Kolan   (2007-09-21 17:36:00) [12]


> See also TComponent.Notification.


Про такой механизм знаю. А что если у меня наследники TObject?

Я просто не пойму почему там нет этой проверки? Причина какая? … хочу разобраться.


Kolan   (2007-09-21 17:30:00) [13]


> Т.е., держатель ссылки должен сам озаботится о ее
> валидности.


Правильно. Держит ссылки список допустим с OwnsObjects. Список уничтожили и Items[10] не пройдёт проверку Assigned и получится AV…


Kolan   (2007-09-21 17:29:00) [14]

> Есть еше FreeAndNil.

Да знаю я, вот и спрашиваю почему Free не работает как FreeAndNil?


> почему он собственно должен делать nil?

Пример:

Я разработчик библиотеки, состоящей из 1 супермега функции:

function GetName(Component: TComponent): string;
begin
 if Assigned(Component) then
   Result := Component.Name;
end;


Теперь я продаю её за бешеные бабаки всем.

И один из этих всех пишет код:

brgin
 Component := TComponent.Create(nil);
 Component.Free;
 ShowMessge(GetName);
end;


И мне придется вырнуть ему деньги :). Так как AV.

Если бы написано было так:
brgin
 Component := TComponent.Create(nil);
 FreeAndNil(Component);
 ShowMessge(GetName);
end;


То AV бф небыло, но где гарантия что там будет именно FreeAndNil? А если бы так вел себя Free, то она бы была…

ЗЫ
 Это ессно пример, но суть отражает.


Leonid Troyanovsky   (2007-09-21 17:09:00) [15]


> Kolan ©   (21.09.07 17:06)  

Потому, что объект один, а ссылок может быть много.
Т.е., держатель ссылки должен сам озаботится о ее
валидности.

See also TComponent.Notification.

--
Regards, LVT.


homm   (2007-09-21 17:09:00) [16]

> Почему Free не делает nil объекту?

А как ты собрался делать nil обекту? :)
Твой «обект» это переменная — сслка, твое право делать с ней все, что хочешь.

Есть еше FreeAndNil.


DVM   (2007-09-21 17:08:00) [17]

а почему он собственно должен делать nil?

Для этого есть FreeAndNil()


Наверх

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