Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2 3 4 5

FreeAndNil


Германн ©   (13.12.18 02:12[60]


> Sha ©   (12.12.18 10:02) [51]
>
> > Германн ©   (12.12.18 02:21) [50]
>
> И GOTO, и FreeAndNil обычно не требуются программисту.
>
> Но в тех редких случаях, когда их применение действительно
> имеет смысл,
> они способны существенно упростить алгоритм или повысить
> скорость.

Не в службу, а в дружбу. А не затруднит-ли вас, Александр
написать простой рабочий пример, где применение FreeAndNil хоть чем-то оправдано?


sniknik ©   (13.12.18 10:19[61]

> где применение FreeAndNil хоть чем-то оправдано?
часто использую для редко используемых форм, т.е. вот есть форма в проге которая используется редко, и после использования надолго не нужна, логично ее создавать перед использованием, и уничтожать после. nil в ее переменной это как индикатор, что нужно ее создать перед показом, что не висит она в данный момент в "фоне".
конечно можно было бы ввести какой другой индикатор, но это было бы как то нелогично.


sniknik ©   (13.12.18 10:21[62]

+
я выше не про саму функцию FreeAndNil, а про принцип, "занилять" формы проще просто присваиванием в деструкторе.


Leonid Troyanovsky ©   (13.12.18 10:39[63]


> sniknik ©   (13.12.18 10:19) [61]

>  что нужно ее создать перед показом, что не висит она в
> данный момент в "фоне".

Валидность ссылки легко проверяется по Screen.Forms.

FAN - MD ;)

--
Regards, LVT.


Sha ©   (13.12.18 10:50[64]

> Германн ©   (13.12.18 02:12) [60]

Обычно это массивы, списки, пулы, очереди и т.п. объектов, из которых долго или неудобно исключать адреса по одному, а гораздо удобнее обнилить или каким-то образом пометить адрес данных. А впоследствии перепаковать или освободить целиком весь контейнер.

В качестве второго примера - многоэтажные этажерки из вложенных try.


sniknik ©   (13.12.18 16:35[65]

> Валидность ссылки легко проверяется по Screen.Forms.
перебором массива сравнивая с несуществующей переменной формы, или по отсутствию текста с именем формы в существующих? вместо простого сравнения if ххх <> nil ...
не не думаю, что это легко. оно конечно все относительно, и для "бешеной собаки 10 верст не крюк", но вот не хочется менять 2 строки кода, на ... да хотя бы на 3, хотя их явно будет побольше.


Eraser ©   (13.12.18 20:38[66]

FreeAndNil оправдан в FMX, чтобы код вел себя одинаково и в VCL, но это скорее редкость.
FreeAndNil скорее подходит для отладки.


> Embarcodere уже который год тянут кота за яйца, но автосборку
> мусора сделать не могут.

они ее уже успели сделать и уже успели передумать http://blog.marcocantu.com/blog/2018-october-Delphi-ARC-directions.html


Германн ©   (14.12.18 01:50[67]


> Sha ©   (13.12.18 10:50) [64]
>
> > Германн ©   (13.12.18 02:12) [60]
>
> Обычно это массивы, списки, пулы, очереди и т.п. объектов

Примерно так я и думал. Задач, в которых нужны "массивы, списки, пулы, очереди и т.п. объектов у меня лично не было.

> sniknik ©   (13.12.18 16:35) [65]
>
> > Валидность ссылки легко проверяется по Screen.Forms.
> перебором массива сравнивая с несуществующей переменной
> формы
А почему бы и нет? Ну не миллионы же у вас в списке Forms!


Leonid Troyanovsky ©   (14.12.18 09:39[68]


> sniknik ©   (13.12.18 16:35) [65]

> не не думаю, что это легко.

Ну, считай, что оно уже есть.

function AssignedFormVar(fv: TForm): Boolean;
var
 i: Longint;
begin
 Result := Assigned(fv);
 if Result then
   with Screen do
     for i := 0 to Screen.FormCount-1 do
       begin
         Result := (fv = Forms[i]);
         if Result then
           Break;
       end;
end;

--
Regards, LVT.


sniknik ©   (14.12.18 10:14[69]

> А почему бы и нет?
а смысл? менять простое сравнение целочисленной переменной на цикл? ...
> Ну не миллионы же у вас в списке Forms!
а вот это тут совсем не причем.

> Ну, считай, что оно уже есть.
круто.. весь проникся мудростью... сарказм.
но в общем то функция ниуть не лечит ту болезнь от которой спасает/ремендуют использовать FreeAndNil.
в итоге тот же вопрос - а смысл?
procedure TForm1.Button2Click(Sender: TObject);
var
 form: TForm;

 function AssignedFormVar(fv: TForm): Boolean;
 var
   i: Longint;
 begin
   Result := Assigned(fv);
   if Result then
     with Screen do
       for i := 0 to Screen.FormCount-1 do
         begin
           Result := (fv = Forms[i]);
           if Result then
             Break;
         end;
 end;

begin
 form:= TForm.Create(self);
 try
   //test - error
   if AssignedFormVar(form)
     then Edit1.Text:= 'Assigned'
     else Edit1.Text:= 'not Assigned';

   form.Free; //FreeAndNil(form);
   if AssignedFormVar(form)
     then Edit2.Text:= 'Assigned'
     else Edit2.Text:= 'not Assigned';
 finally
   form.Free;
 end;
end;


Leonid Troyanovsky ©   (14.12.18 10:42[70]


> sniknik ©   (14.12.18 10:14) [69]

> но в общем то функция ниуть не лечит ту болезнь от которой
> спасает/ремендуют использовать FreeAndNil.

Не совсем понял пример, но, видимо, д.б.

 finally
   if AssignedFormVar(form) then
     form.Free;
 end;

--
Regards, LVT.


sniknik ©   (14.12.18 15:55[71]

> Не совсем понял пример
одно из того почему рекомендуют FreeAndNil вместо Free, как раз такая ситуация, не нужно доп.проверок. а тут от чего уходим к тому и пришли, только из-за желания использовать "крутой" метод проверки.


dmk ©   (14.12.18 22:03[72]

>только из-за желания использовать "крутой" метод проверки
Но ведь других средств нет. Только проверка на nil.
После FreeInstance образуется адресное пространство, которое может быть в зоне AV.
Неудобная недоработка.


sniknik ©   (14.12.18 23:31[73]

> Но ведь других средств нет. Только проверка на nil.
она есть во Free которым уже все надрессированы пользоваться, "на автомате". осталось "передрессироваться" на использование FreeAndNil, и проблема "уйдет".
пример вон выше, скопируй получи ошибку, а после раскоментарь/замени Free на FreeAndNil.

> Неудобная недоработка.
эта, даже не знаю что сказать... вот прямо перед вами доработанное средство... или как говорил классик "разруха она в головах".


Leonid Troyanovsky ©   (16.12.18 09:22[74]


> sniknik ©   (14.12.18 15:55) [71]

> одно из того почему рекомендуют FreeAndNil вместо Free

FAN - MD. Костыль при кривом проектировании.

Особенно для форм, кои есть компоненты и, в случае удержания ссылок на оные,
должно пользовать механизм Notification.
Ну, или, на худой конец, массивом Forms, для отыскания утерянной формы.

Бо, и глобальные переменные - MD.

--
Regards, LVT.


sniknik ©   (16.12.18 15:28[75]

> FAN - MD. Костыль при кривом проектировании.
и че ты не консультант борланда был когда он и функцию безопасного обниления делал да проверку на нил во фри сувал, чуть ли не изначально при появлении генофонда... уж объяснил бы им ужо.

> должно пользовать механизм Notification.
ага, особенно когда из потока к форме обращаешься т.е. нотификейшн перед нотификейшном, первый проверка есть ли она (только куда что посылать) второе собственно рабочее событие... ну очень удобно.

> Бо, и глобальные переменные - MD.
вообще чего мелочится? программирование - MD. (аппликатион если чё тоже глобальная переменная)

з.ы. весь пост - сарказм. уже почему то по другому не получается. ведь все просто - есть возможность у языка, пользуйся, если к месту, удобно, нет "скрытых багов". нет же куча народу с догмами, того нельзя сего нельзя, и хоть бы что аргументированно... но нет, за аргументы выдают что-то по заковыристые, скоро 2 + 2 будут советовать не просто операцию использовать а что-то через COM-обьекты, микросервисы и т.д. еже с ними.


ухты ©   (16.12.18 19:57[76]

Фри реально костыль. )


sniknik ©   (16.12.18 23:47[77]

и давно ты кошерный деструктор использовал? который не костыль.
а вот была бы ява там подобное синтаксическим сахаром называют, ... а баги фичами...


ухты ©   (17.12.18 00:20[78]

Ну нет, синтаксический сахар это другое. Например тернарная операция или типа того.
Кстати, буквально вот http://delphimaster.ru/cgi-bin/forum.pl?id=1542948910&n=3, в делфи ввели возможность объявление переменной "по месту" + определение типа в компайл тайм, вот это тоже сахар. А фри это немного из другой оперы. И как на мой взгляд, особо ничего не давшая. АВ происходит ничуть не реже. ))

А что касается механизм Notification для вашей формы, то я согласен с вами, оно тут никчему. Вместо класической глобальной переменной, сделал бы статичное свойство в классе самой формы, и все довольны.))


Eraser ©   (17.12.18 03:50[79]


> ухты ©   (17.12.18 00:20) [78]


> АВ происходит ничуть не реже. ))

счастье, когда оно происходит, а не молча портит память.


Страницы: 1 2 3 4 5 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо