Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];

Вниз

Еще раз про метод Free   Найти похожие ветки 

 
Raduga   (2003-10-10 10:46) [0]

Здравстуйте.
У меня к вам маленький вопросик.
После уничтожения объекта через free нужно ли выставлять в нил ссылку:

...
myobject.free;
myobject:=nil;


 
stone   (2003-10-10 10:47) [1]

Желательно, но проще сделать FreeAndNil(myobject)


 
Семен Сорокин   (2003-10-10 10:48) [2]

если потом проверять на Assigned(myobject) например, то да, иначе нет


 
Verg   (2003-10-10 10:48) [3]


> После уничтожения объекта через free нужно ли выставлять
> в нил ссылку:


Смотря в каком случае.

В общем - совсем не обязательно.


 
Raduga   (2003-10-10 10:55) [4]

Спасибо всем


 
Raduga   (2003-10-10 12:35) [5]

Подождите...а есть разница между

...
myobject.free;
myobject:=nil;


и

...
myobject:=nil;
myobject.free;


 
Skier   (2003-10-10 12:36) [6]

>Raduga (10.10.03 12:35) [5]
Есть и ОГРОМНАЯ !


 
Raduga   (2003-10-10 12:37) [7]

>Skier © (10.10.03 12:36) [6]
КАКАЯ!!!


 
Anatoly Podgoretsky   (2003-10-10 12:38) [8]

Raduga (10.10.03 10:46)
Не нужно, а если нужно, то это недостатки проектирования.

Raduga (10.10.03 12:35) [5]
А это вообще огромная ошибка


 
KSergey   (2003-10-10 12:38) [9]

> [5] Raduga (10.10.03 12:35)

Ровно такая же как между сначала сделать наркоз, потом отрезать апендицит и сначала отрезать апендицит, а потом сделать наркоз.

Т.е. набор действий одинаков, однако последовательность - крайне важна.


 
Skier   (2003-10-10 12:41) [10]

>Raduga (10.10.03 12:37) [7]
Советую в этом вопросе разобраться самому !
Будет дольше, но зато разницу усвоишь на всю программисткую жизнь ! И это тебе поможет при программирование не только на Delphi


 
Raduga   (2003-10-10 12:42) [11]

А как тогда работает FreeAndNil?


 
Юрий Федоров   (2003-10-10 12:42) [12]

>>myobject:=nil;
>>myobject.free;
Сначала потеряли ссылку на объект, потом пытаемся его разрушить.
Исключения не произойдет, потому что метод Free сначала проводит проверку на nil, в этом случае ничего не делает.
ТО есть просто бросаешь неразрушенный объект - допускаешь утечку памяти

>>Ровно такая же как между сначала сделать наркоз, потом отрезать апендицит и сначала отрезать апендицит, а потом сделать наркоз.

:-)))


 
Skier   (2003-10-10 12:44) [13]

>Raduga (10.10.03 12:42) [11]

> А как тогда работает FreeAndNil?

Правильно ! :)


 
Verg   (2003-10-10 12:45) [14]


> Raduga (10.10.03 12:42) [11]
> А как тогда работает FreeAndNil?


Не так, как NilAndFree


 
Плохиш_   (2003-10-10 12:46) [15]

>Raduga (10.10.03 12:42) [11]

Что в исходники глянуть не досуг?


 
Raduga   (2003-10-10 12:48) [16]

>Плохиш_ (10.10.03 12:46) [15]
Вот и глянул, поэтому в конец запутался...


 
Юрий Федоров   (2003-10-10 12:53) [17]

На мой взшляд FreeAndNil немного опасен.
Была ситуация - таким образом разрушался объект, в какой-то момент он превратился в интерфейс.
Компилятор пропустил, с памятью случилась беда


 
Skier   (2003-10-10 12:55) [18]

>Юрий Федоров © (10.10.03 12:53) [17]
Вообще смешивать объектную и интерфейсеую модель не есть хорошо...


 
Плохиш_   (2003-10-10 12:56) [19]

>Raduga (10.10.03 12:48) [16]

ну если в 3х строчках запутался ...


 
Юрий Федоров   (2003-10-10 12:59) [20]

>>Skier © (10.10.03 12:55) [18]
>>Вообще смешивать объектную и интерфейсеую модель не есть хорошо...
Она как раз менялась с объектной на интерфейсную ))


 
Raduga   (2003-10-10 13:17) [21]

Запутался...


procedure FreeAndNil(var Obj);
var
P: TObject;
begin
P := TObject(Obj);
TObject(Obj) := nil; // clear the reference before destroying the object
P.Free;
end;


1.Почему параметр Obj передается через var
2. В P содержится адрес Obj, так? Если TObject(Obj) := nil, то что в P?


 
Verg   (2003-10-10 13:18) [22]


> то что в P?


> P := TObject(Obj);


 
Anatoly Podgoretsky   (2003-10-10 13:25) [23]

Verg © (10.10.03 12:45) [14]
Не так

Вообще использовать FreeAndNil(var Obj) очень не красиво, нет никакого контроля, отрыв от классовой модели, передается абстрактный указатель. Компилятор не в состоянии это проверить.


 
Verg   (2003-10-10 13:35) [24]


> Компилятор не в состоянии это проверить.


А че ему проверять-то, если ему скалаи TObject() ?
Он "взял под козырек" и все.

Когда я напишу TObject(nil).free - это тоже нехорошо, но компилятор тут не при чем.


> Anatoly Podgoretsky © (10.10.03 13:25) [23]
> Verg © (10.10.03 12:45) [14]
> Не так


............


 
Anatoly Podgoretsky   (2003-10-10 14:04) [25]

Если бы было обхявлено FreeAndNil(Obj: TObject) то и то было бы лучше


 
Юрий Федоров   (2003-10-10 14:06) [26]

>>Anatoly Podgoretsky © (10.10.03 14:04) [25]
Странно, почему так не сделали...


 
Verg   (2003-10-10 14:12) [27]


> Если бы было обхявлено FreeAndNil(Obj: TObject) то и то
> было бы лучше


Уж тогда так.

FreeAndNil(var Obj: TObject);


 
Anatoly Podgoretsky   (2003-10-10 14:18) [28]

Юрий Федоров © (10.10.03 14:06) [26]
Для этого надо знать предысторию Борландовских груп новостей, многие хранят в нетипизированных списках и других подобных местах. Само включение этой функции было провокацией.

Verg © (10.10.03 14:12) [27]
Поправка принимается.


 
Плохиш_   (2003-10-10 14:19) [29]

>Raduga (10.10.03 13:17) [21]


> 1.Почему параметр Obj передается через var
> 2. В P содержится адрес Obj, так? Если TObject(Obj) := nil,
> то что в P?


1. Потому, что изменённое значение Obj должно вернуться в вызвавший код
2. С чего бы это? В P находится адрес области памяти на которую указывает/указывал Obj



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

Форум: "Основная";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.011 c
1-74313
SergP
2003-10-12 06:21
2003.10.23
Вопрос по динамическим массивам.


3-73991
Настенька
2003-09-30 09:10
2003.10.23
файлы BDE


14-74419
VID
2003-10-05 22:27
2003.10.23
HTTP прокси сервера не дают никакой разницы...


1-74169
Chuha
2003-10-10 09:00
2003.10.23
ListBox


1-74302
Meronikol
2003-10-12 14:13
2003.10.23
Как узанть размер каталога со всеми его подпапками и файлами?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский