![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему 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()