Форум: "Основная";
Текущий архив: 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