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

Вниз

Еще раз про метод 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.019 c
6-74367
Dimon
2003-08-28 06:00
2003.10.23
Статистика использования шар на локальном компьютере


3-74065
uu
2003-10-02 14:05
2003.10.23
импорт из HTML


1-74163
Ev1972
2003-10-10 11:41
2003.10.23
Как изменить ширину полосы прокрутки у TListBox?


3-73979
victor
2003-10-01 12:27
2003.10.23
QReport


1-74257
kopcap
2003-10-13 20:40
2003.10.23
Как в Delphi использовать MMX ???