Форум: "Начинающим";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];
ВнизПочему Free не делает nil объекту? Найти похожие ветки
← →
Kolan © (2007-09-21 17:06) [0]Здравствуйте,
Часто задаю себе этот вопрос, когда попадаюсь на том, что Assigned срабатывает так как Объект не nil, и выскакивает AV, так как ему сделали Free.
← →
DVM © (2007-09-21 17:08) [1]а почему он собственно должен делать nil?
Для этого есть FreeAndNil()
← →
homm © (2007-09-21 17:09) [2]> Почему Free не делает nil объекту?
А как ты собрался делать nil обекту? :)
Твой «обект» это переменная — сслка, твое право делать с ней все, что хочешь.
Есть еше FreeAndNil.
← →
Leonid Troyanovsky © (2007-09-21 17:09) [3]
> Kolan © (21.09.07 17:06)
Потому, что объект один, а ссылок может быть много.
Т.е., держатель ссылки должен сам озаботится о ее
валидности.
See also TComponent.Notification.
--
Regards, LVT.
← →
Kolan © (2007-09-21 17:29) [4]> Есть еше 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, то она бы была…
ЗЫ
Это ессно пример, но суть отражает.
← →
Kolan © (2007-09-21 17:30) [5]
> Т.е., держатель ссылки должен сам озаботится о ее
> валидности.
Правильно. Держит ссылки список допустим с OwnsObjects. Список уничтожили и Items[10] не пройдёт проверку Assigned и получится AV…
← →
Kolan © (2007-09-21 17:36) [6]
> See also TComponent.Notification.
Про такой механизм знаю. А что если у меня наследники TObject?
Я просто не пойму почему там нет этой проверки? Причина какая? … хочу разобраться.
← →
stanislav © (2007-09-21 17:37) [7]Kolan © (21.09.07 17:29) [4]
>И один из этих всех пишет код:
Вобще-то в учебниках по Dlphi написано что нельзя обращаться к еще не созданному и уже удаленному объекту,
Можешь вместо бабок ему указать на учебник.
А в функции можно предусмотреть Try Except
← →
Leonid Troyanovsky © (2007-09-21 17:37) [8]
> Kolan © (21.09.07 17:30) [5]
> Правильно. Держит ссылки список допустим с OwnsObjects.
> Список уничтожили
Ну, для этого есть Owner (Parent).
Т.е., дельфийский Т. Бульба, сирот не оставляющий.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2007-09-21 17:44) [9]
> Kolan © (21.09.07 17:36) [6]
> Про такой механизм знаю. А что если у меня наследники TObject?
Значит, делай подобный механизм собс-ручно.
> Я просто не пойму почему там нет этой проверки? Причина
> какая?
Зачем плодить сущности сверх необходимого?
Если тебе понадобился Notification, возможно,
чтои еще чего-то пригодится от TComponent.
--
Regards, LVT.
← →
Kolan © (2007-09-21 17:48) [10]> Вобще-то в учебниках по Dlphi написано что нельзя обращаться
> к еще не созданному и уже удаленному объекту,
> Можешь вместо бабок ему указать на учебник.
Да этот нерадивый программист — я. Просто иногда разрушается в одном месте а проверка эта совсем в другом…
Значит, делай подобный механизм собс-ручно.
Я че его делать? FreeAndNil уже есть. Только вот если бы его можно было принудительно использовать…
← →
Leonid Troyanovsky © (2007-09-21 17:50) [11]
> Kolan © (21.09.07 17:48) [10]
> Значит, делай подобный механизм собс-ручно.
> Я че его делать? FreeAndNil уже есть
RTFM [3].
До просветления.
Я б наставил еще и "!"
Но, ты их пугаешься :)
--
Regards, LVT.
← →
Kolan © (2007-09-21 17:58) [12]> До просветления.
А где это написано? Особенно интересно прочесть про то почему он должен это делать?
И кроме того при том же Notification объект не сам заботится о валидности. Объект, который контролирует объект посылает сообщения, а без это го сообщения о валидностине позаботишься…
← →
Kolan © (2007-09-21 18:01) [13]
> Я б наставил еще и «!»
> Но, ты их пугаешься :)
Да Ega крикнул, я чуть со стула не упал… мотр прихватило…
← →
Leonid Troyanovsky © (2007-09-21 18:07) [14]
> Kolan © (21.09.07 17:58) [12]
> А где это написано? Особенно интересно прочесть про то почему
> он должен это делать?
Понятие "один - много", мне здесь сложно объяснить :)
Еще раз, медленно: обниление одной ссылки никак
не гарантирует, что у кого-то в закромах не осталось
невалидной, со всеми вытекающими.
> И кроме того при том же Notification объект не сам заботится
> о валидности. Объект, который контролирует объект посылает
> сообщения
RTFM: Notification.
Но, с другой стороны, конечно, это всего лишь Notification.
Хозяин-барин.
--
Regards, LVT.
← →
Юрий Зотов © (2007-09-21 18:10) [15]> 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 тоже не может определить ВСЕ ссылки на объект и узнать адреса ВСЕХ этих ссылок. Она знает только одну - ту, которую ей передали.
Желать такого - все равно, что желать, чтобы в момент смерти человека его телефон автоматически вычеркивался из всех записных книжек, в которых он был записан.
← →
Kolan © (2007-09-21 18:12) [16]> каким волшебным образом объект при своем разрушении может
> определить, что на него ссылаются именно 3 переменные и
> узнать адреса этих переменных
Да, теперь я понял свою ошибку. Выходит безNotification
механизма не обойтись…
Благодарю.
← →
Сергей М. © (2007-09-21 18:50) [17]
> Почему Free не делает nil объекту?
Потому что объекту нельзя "сделать nil".
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.039 c