Конференция "Прочее" » 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://pda.delphimaster.net/?id=1542948910&n=3, в делфи ввели возможность объявление переменной "по месту" + определение типа в компайл тайм, вот это тоже сахар. А фри это немного из другой оперы. И как на мой взгляд, особо ничего не давшая. АВ происходит ничуть не реже. ))

    А что касается механизм Notification для вашей формы, то я согласен с вами, оно тут никчему. Вместо класической глобальной переменной, сделал бы статичное свойство в классе самой формы, и все довольны.))
  • Eraser © (17.12.18 03:50) [79]

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


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

    счастье, когда оно происходит, а не молча портит память.
Есть новые Нет новых   [134427   +34][b:0.001][p:0.001]