Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.14;
Скачать: CL | DM;

Вниз

Почему 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, то она бы была&#133

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


 
Kolan ©   (2007-09-21 17:30) [5]


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


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


 
Kolan ©   (2007-09-21 17:36) [6]


> See also TComponent.Notification.


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

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


 
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 написано что нельзя обращаться
> к еще не созданному и уже удаленному объекту,
> Можешь вместо бабок ему указать на учебник.

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

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


 
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 объект не сам заботится о валидности. Объект, который контролирует объект посылает сообщения, а без это го сообщения о валидностине позаботишься&#133


 
Kolan ©   (2007-09-21 18:01) [13]


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


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


 
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 механизма не обойтись&#133

Благодарю.


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


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


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



Страницы: 1 вся ветка

Текущий архив: 2007.10.14;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
15-1189419547
Галинка
2007-09-10 14:19
2007.10.14
Традиции программирования2: или ...


2-1190004580
GeLLeR
2007-09-17 08:49
2007.10.14
Сообщение нажатия кнопки


1-1186067664
Кирилл_А
2007-08-02 19:14
2007.10.14
GDI+


2-1189843541
kash_d
2007-09-15 12:05
2007.10.14
Шифрование/дешифрование файлов


15-1190081676
Slider007
2007-09-18 06:14
2007.10.14
С днем рождения ! 18 сентября 2007 вторник