powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Улучшил FreeAndNil. Можете не благодарить.
25 сообщений из 226, страница 4 из 10
Улучшил FreeAndNil. Можете не благодарить.
    #39953971
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

у тебя есть какая-то веская причина зомби ссылки хранить? :)
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953973
Я думаю от перестановки действий, ничего не меняется.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953974
Да ну вас в попу


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
procedure FreeAndNil2(var Obj); inline;
begin
  TObject(Obj).Free;
  Pointer(Obj) := nil;
end;

procedure FreeAndNil(var Obj);    inline;
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  t: TForm;
begin
  t := TForm.Create(nil);
  FreeAndNil(t);
  t := TForm.Create(nil);
  FreeAndNil2(t);
end;




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Unit1.pas.44: t := TForm.Create(nil);
005FD16C 33C9             xor ecx,ecx
005FD16E B201             mov dl,$01
005FD170 A194025E00       mov eax,[$005e0294]
005FD175 E8AAACFEFF       call TCustomForm.Create
005FD17A 8945FC           mov [ebp-$04],eax
Unit1.pas.45: FreeAndNil(t);
005FD17D 8B45FC           mov eax,[ebp-$04]
005FD180 33D2             xor edx,edx
005FD182 8955FC           mov [ebp-$04],edx
005FD185 E8E2ACE0FF       call TObject.Free


Unit1.pas.46: t := TForm.Create(nil);
005FD18A 33C9             xor ecx,ecx
005FD18C B201             mov dl,$01
005FD18E A194025E00       mov eax,[$005e0294]
005FD193 E88CACFEFF       call TCustomForm.Create
005FD198 8945FC           mov [ebp-$04],eax
Unit1.pas.47: FreeAndNil2(t);
005FD19B 8B45FC           mov eax,[ebp-$04]
005FD19E E8C9ACE0FF       call TObject.Free
005FD1A3 33C0             xor eax,eax
005FD1A5 8945FC           mov [ebp-$04],eax
Unit1.pas.48: end;




...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953999
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F
И это всего лишь твое неподкрепленное частное мнение.))

Лет пятнадцать назад я разработал одну программу, предназначенную работать 24x7x365. Через некоторое время тогдашний начальник решил усилить надёжность и сказал другому программисту сделать программу-монитор, которая каждые несколько минут проверяла бы, работает ли моя программа, и если она упала - перезапускала бы её. В итоге выяснилось, что программа-монитор каждые неделю-две падает, в то время как моя программа спокойно продолжает работать.

Так вот, я не сомневаюсь, что автор того монитора был бы с тобой согласен :)
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954034
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon
Vlad F,

у тебя есть какая-то веская причина зомби ссылки хранить? :)

Дык, в общем случае нельзя будет сказать на сколько они в этом случае зомби.))
Говорю же, и концептуально и стилистически ни один из этих подходов не лучше.
Оба хуже, имхо. И уж, как минимум, один другого стоит.))
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954035
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Vlad F
И это всего лишь твое неподкрепленное частное мнение.))

Лет пятнадцать назад я разработал одну программу, предназначенную работать 24x7x365. Через некоторое время тогдашний начальник решил усилить надёжность и сказал другому программисту сделать программу-монитор, которая каждые несколько минут проверяла бы, работает ли моя программа, и если она упала - перезапускала бы её. В итоге выяснилось, что программа-монитор каждые неделю-две падает, в то время как моя программа спокойно продолжает работать.

Так вот, я не сомневаюсь, что автор того монитора был бы с тобой согласен :)

А в огороде бузина, а в Киеве - дядька.)))
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954132
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Я думаю от перестановки действий, ничего не меняется.
ВсеРазумный
Да ну вас в попу
Что это было? Проблемы с ассемблером? Отличия есть, также как и в реальных программах. Мне лично встречался код (так уж было написано) когда использование FreeAndNil отломило работоспособность. Именно из-за предварительного обнуления переменной. Пришлось откатывать, т.к. на переделку архитектуры времени не было
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954151
white_nigger,

То есть проблема в дурочке программисте, а не в функции.

Ибо уничтожив объект, у него бы осталась ссылка на объект, при использование в последующем, с вылетом в AV


Хватит сосать проблемы из пальца.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954162
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
То есть проблема в дурочке программисте
Абсолютно тоже самое можно сказать о необходимости использования костыля FreeAndNil. И с темы не съезжай, что ты хотел показать тем постом с дизассемблером?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954166
white_nigger
что ты хотел показать тем постом с дизассемблером?


От переустановки действий, слагаемое не меняется.

22126998

white_nigger
Абсолютно тоже самое можно сказать о необходимости использования костыля FreeAndNil


Вообще, бездумное освобождения объекта - признак слабоумия.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954168
Если мы вешаем динамически созданные объекты на форму - owner, то форма в конце программы уничтожит данные объекты. И освобождение не нужно.

Но если мы планируем динамическое GUI с перезагрузкой и добавлением элементов GUI то имеет смысл, удалять объекты, дабы не загружать всю память программы. И помечать ссылки в массиве объектов - null маркером. Дабы понимать какой сейчас объект может использоваться

И не нарваться на AV от уже освобождённого объекта. Будет полезен вызов FreeAndNil
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954180
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный, да-да, а ещё с дури можно и хрен сломать. Разница в коде есть, если не видишь - учи ассемблер.
PS: и тебе не стоит мне объяснять как работают визуальные компоненты)))
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954206
white_nigger,

Нет никакой разницы. Когда объект освобождён, хранить ссылку не имеет смысла. Это мёртвый объект, вызвав у которого метод\свойства. Будет тот же самый AV.

И уж тем более не имеет смысла, в каком порядке обнулять ссылку на объект.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
procedure FreeAndNil2(var Obj); inline;
begin
  TObject(Obj).Free;
  Pointer(Obj) := nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  t: TForm;

  errStr: string;
begin
  errStr := '';
  Try
    t := TForm.Create(nil);
    FreeAndNil(t);
    t.Show;
  except
    on E: Exception do
      errStr := E.ClassName + ' : ' + E.Message + #13 + #13;
  end;

  Try
    t := TForm.Create(nil);
    FreeAndNil2(t);
    t.Show;
  except
    on E: Exception do
      errStr := errStr + E.ClassName + ' : ' + E.Message + #13 + #13;
  end;

  Try
    t := TForm.Create(nil);
    t.Free;
    t.Show;
  except
    on E: Exception do
      errStr := errStr + E.ClassName + ' : ' + E.Message + #13 + #13;
  end;

  ShowMessage(errStr);
end;




Имеем удаление через Free с последующим обращением к объекту. И аналогично FreeAndNil

EAccessViolation : Access violation at address 005E929F in module 'Project1.exe'. Read of address 000003CC

EAccessViolation : Access violation at address 005E929F in module 'Project1.exe'. Read of address 000003CC

EAccessViolation : Access violation at address 005E8F57 in module 'Project1.exe'. Read of address 00000010


Прекрасно видим, что функция FreeAndNil вообще не причём. И мешает только тому, у кого руки из попы.

0 разница.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954209
Самый лучший отладчик в мире. По break выкидывает вообще не туда, куда надо.


Это обречённость неумелых рук, из попы.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954211
Ой! Да как же так! Это же ужассная и кривая функция.

И обнуление объектам НЕ НУЖНО!!!

Ржу. Ору.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954214
Вот такой баг, с не обнулённой переменной. Вы будете всей командой - пол года искать.

Так что кушайте функцию FreeAndNil и не парьтесь.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954215
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут прибежали санитары и зафиксировали нас. (с) ВСВ))
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954217
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Так что кушайте функцию FreeAndNil и не парьтесь.

"Люди делятся на две категории: те, кто делает бэкапы, и те, кто уже делает бэкапы"

Было время, когда FreeAndNil не было. Она появилась довольно поздно, не то в пятой, не то в шестой дельфе. Поэтому дельфи-программисты делились на тех, кто использует аналогичную самописную подпрограмму, и на тех, кто уже использует аналогичную самописную подпрограмму. Я был из первых - потому что ещё до дельфы, со времён работы на Си, крепко усвоил, насколько это облегчает надёжное кодирование.

А потом... со всем, что разрабатывают люди, происходит одна и та же история. Сначала какого-то инструмента нет, и без него довольно плохо. Технология развивается, находит хорошее решение очередной задачи (тот самый инструмент), все счастливы. Потом вырастает поколение, которому этот инструмент и его результаты уже привычны, а вот с проблемами из-за его отсутствия они на своей шкуре не сталкивались. И они начинают говорить, что инструмент плохой, и без него лучше. Дальше они начинают писать без него, и либо умнеют, либо изобретают какой-нибудь плохой велосипед вроде тех, которыми пользовались до разработки этого инструмента, и в зависимости от степени ослиности упрямства держатся за него, порой долго, порой очень долго.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954218
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не помогут санитары. Пациент уже многократно сбегал на свободу.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954221
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

А представь, что у тебя дальше код идёт:
Код: pascal
1.
2.
if t <> nil then 
  t.Show;


И теперь прогони свои тесты.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954229
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Вот такой баг, с не обнулённой переменной. Вы будете всей командой - пол года искать.

Так что кушайте функцию FreeAndNil и не парьтесь.


Такое никогда не возникнет если следовать поставленным парадигмам при разработке архитектуры ПО...

1) Кто объект создал - тот его и разрушает.
2) Создал в конструкторе - разрушь в деструкторе.
3) Создал в методе, разрушь в том же методе.
4) Написал Create пиши сразу Free

Все остальные случаи укладываются в эти 4 пункта, если правильно проектировать классы и абстракции...

А если кто-то в команде так напишет, будет уволен без выходного пособия лишен премии из-за недостатка квалифицированных кадров, ибо не понимает что делает...
Код: pascal
1.
2.
3.
t := TForm.Create(nil);
t.Free;
t.Show;



Для меня FreeAndNil бессмысленный... реальное его использование 0.1% для глобальных синглтонов
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954233
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
Такое никогда не возникнет если следовать поставленным парадигмам при разработке архитектуры ПО...

Интересно, как же следовать этим парадигмам ну хотя бы для разработки простейшего гуёвого Hello, world. Application.CreateForm им не соответствует, да и другие способы создания окон - тоже.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954241
alekcvp
ВсеРазумный,

А представь, что у тебя дальше код идёт:
Код: pascal
1.
2.
if t <> nil then 
  t.Show;


И теперь прогони свои тесты.


Да никогда в жизни такого кода у тебя не будет, потому что ты в одном месте освободишь. А в другой процедуре получишь по попе своей шаловливой.


Вот и делай теперь на каждое обращение проверку.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954242
X-Cite,

Как видим, он вообще не бессмысленный. Ибо задача приведена на пальцах. А на деле как я уже сказал выше, освобождение может произойти раньше. Тупо просто класс крашнулся выйдя из процедуры - потеряв ссылку. И в конце концов в другой процедуре ты получил по попе.

Да, в целях экономии, делается PPointer, что бы мы знали что происходит с другой переменной.

А если другая переменная через FreeAndNil получила null то там не придётся потом всей командой пол года искать в чём же проблема. Ибо отладчик скажет где у нас нет данных.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954243
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Да никогда в жизни такого кода у тебя не будет, потому что ты в одном месте освободишь. А в другой процедуре получишь по попе своей шаловливой.
Вот и делай теперь на каждое обращение проверку.

Если ты не следишь за логикой своего приложения и у тебя в одном месте может освободиться объект, который используется в другом, при этом ты никак его текущее состояние не проверяешь - ну, ССЗБ.
...
Рейтинг: 0 / 0
25 сообщений из 226, страница 4 из 10
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Улучшил FreeAndNil. Можете не благодарить.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]