Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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, то она бы была&#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.039 c
2-1189754420
Ega23
2007-09-14 11:20
2007.10.14
Может ли конструктор быть виртуальным?


1-1185729009
SkySpeed
2007-07-29 21:10
2007.10.14
Как можно определить Интернет-ссылки, к которым обращается пр-ма?


2-1190529112
zavialov
2007-09-23 10:31
2007.10.14
Не увеличивать счетчик ссылок - создать отдельный экземпляр.


2-1189751911
nick2000
2007-09-14 10:38
2007.10.14
не работает запрос через Clientdataset


1-1185968425
Alexey 12
2007-08-01 15:40
2007.10.14
Как узнать, что файл не используется другой программой?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский