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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  procedure FreeAndNil(const [ref] Obj :TObject);
  var
    vTmp :TObject;
  begin
    if Obj <> nil then begin
      vTmp := Obj;
      TObject(Addr(Obj)^) := nil;
      vTmp.Destroy;
    end;
  end;
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39949599
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov
Достало, что в FreeAndNil можно по ошибке передать что угодно и компилятор это никак не проверяет.


а какие из-за этого проблемы?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39949600
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11
Maxim Rusov
Достало, что в FreeAndNil можно по ошибке передать что угодно и компилятор это никак не проверяет.


а какие из-за этого проблемы?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39949647
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Maxim Rusov
Достало, что в FreeAndNil можно по ошибке передать что угодно и компилятор это никак не проверяет.


а какие из-за этого проблемы?
при рефакторинге можешь случайно объект на интерфейс или другой тип подменить
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39949686
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Является ли этот метод адским хаком? Какие есть недостатки?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39949704
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Longneck
Является ли этот метод адским хаком? Какие есть недостатки?


Ну, одну несовместимость я словил. Но и 2 ошибки нашел в except частях, которым уже хрен знает сколько лет. Так что я его в Debug включаю, а в Release отключаю.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39949929
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Longneck
Является ли этот метод адским хаком? Какие есть недостатки?
исходный метод сам по себе хак, и не от хорошей жизни

даже если предложенная замена это хак, то выходит, что один хак заменили другим, чуток более удобным
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39949934
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov
Код: pascal
1.
procedure FreeAndNil(const [ref] Obj :TObject);


Можно еще проще:
Код: pascal
1.
2.
3.
4.
5.
procedure FreeAndNil(var Obj: TObject); inline;
begin
  Obj.free;
  Obj := nil;
end;



Maxim Rusov
Достало, что в FreeAndNil можно по ошибке передать что угодно и компилятор это никак не проверяет.

Сложно, наверное, работать в команде с людьми, которые делают такие ошибки...
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39949955
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman

Сложно, наверное, работать в команде с людьми, которые делают такие ошибки...

Сложно работать в команде с людьми, которые даже не проверяют, что они написали
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39949961
Ну не просто так же было в оригинале написано (var Obj) скорее всего, подразумевалось что, можно вызвать не только для объекта с наследником TObject
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950156
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Можно еще проще:
Код: pascal
1.
2.
3.
4.
5.
procedure FreeAndNil(var Obj: TObject); inline;
begin
  Obj.free;
  Obj := nil;
end;

Нельзя. Попробуй так
Код: pascal
1.
2.
3.
4.
5.
6.
var
  LList: TStrings;
begin
  LList := TStringList.Create;
  Wadman.FreeAndNil(LList);
end;
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950158
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
подразумевалось
Не подразумевалось. С
Код: pascal
1.
var Obj: TObject

ты сможешь передать в процедуру только переменную типа строго TObject
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950208
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov, для гурманов наслаждений обязательно ещё и такое:
Код: pascal
1.
2.
3.
4.
procedure FreeAndNil(var Obj); inline;
begin
  TObject(AtomicExchange(Pointer(Obj), nil)).Free;
end;
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950223
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Ну не просто так же было в оригинале написано (var Obj) скорее всего, подразумевалось что, можно вызвать не только для объекта с наследником TObject

Ээ... а разве в дельфи могут существовать объекты - не наследники TObject (class, не object)?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950250
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM
Maxim Rusov, для гурманов наслаждений обязательно ещё и такое

Зачем? Для потокобезопасности? Это бессмысленно. Для того того чтобы записать в одну строчку? Aтомарные функции - тормозные. Нет, это нам не нужно.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950253
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreeAndNil вообще не нужен.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950255
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Чой то? Очень даже нужен.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950256
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не пользуюсь.

Зачем?

Дурная функция какая-то.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950257
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошая функция (а моя - еще лучше). 3-в-1.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950264
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov
Достало, что в FreeAndNil можно по ошибке передать что угодно и компилятор это никак не проверяет.
Решил исправить. Делает тоже самое, но передавать можно только объекты. Наслаждайтесь.

Зато ваша не проверяет такой косяк:
Код: pascal
1.
2.
3.
4.
5.
6.
procedure SomeThing(const Obj: TObject);
begin
   ...
   ...
   FreeAndNil(Obj); 
end;


Компилятор не ругнётся, а потом будет сюрприз.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950265
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Я не пользуюсь.
Зачем?
Дурная функция какая-то.

Что, никогда не использовали объектные переменные, которые содержат ссылки на динамически создающиеся объекты?..

Типа
Код: pascal
1.
2.
3.
4.
5.
6.
  if FSomeObject = nil then
    FSomeObject := TSomeObject.Create;
  ...
   
  ...
  FreeAndNil(FSomeObject);
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950268
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

у меня объект может быть nil только на старте, пока не инициализируется.

В процессе работы убитые объекты с "висящими" или пустыми ссылками я стараюсь просто не допускать.

ИМХО это принципиально убирает возможность где-то накосячить с этими ссылками в будущем.

В случаях исключений я явно присваиваю ссылке nil, без всяких кривых FreeAndNil.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950274
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov
Для потокобезопасности? Это бессмысленно.
ню-ню, расскажи тогда свой смысл в использовании FreeAndNil...
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950319
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreeAndNil для сомневающихся, только DestroyAndInvalidate/FreeAndInvalidate
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950501
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
alekcvp,
В случаях исключений я явно присваиваю ссылке nil, без всяких кривых FreeAndNil.

А в чём он кривой?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950586
alekcvp,

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

Не лучше, а безопаснее.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950627
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
ВсеРазумный
2 презерватива лучше, чем 1

Не лучше, а безопаснее.
Теоретики...
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950629
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
А в чём он кривой?
Содомия с промежуточной ссылкой и приведением типов через указатели.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950641
rgreat,

Вообще - то никаких приведений нет, к типам. В asm будут только адреса. А приведения нужны, что бы по offset определённого класса, обращаться к нужным элементам в памяти
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950645
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Вообще - то никаких приведений нет <..> а приведения нужны, что бы
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950652
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Содомия с промежуточной ссылкой и приведением типов через указатели.

А в промежкточной ссылке - большой смысл. Просто ты его еще не постиг.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950655
rgreat,

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

В главном сообщение

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure FreeAndNil(const [ref] Obj: TObject);
var
  vTmp: TObject;
begin
  if Obj <> nil then
  begin
    vTmp := Obj;
    TObject(Addr(Obj)^) := nil;
    vTmp.Destroy;
  end;
end;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Project1.dpr.12: begin
0041BD90 55               push ebp
0041BD91 8BEC             mov ebp,esp
Project1.dpr.13: if Obj <> nil then
0041BD93 833800           cmp dword ptr [eax],$00
0041BD96 740F             jz $0041bda7
Project1.dpr.15: vTmp := Obj;
0041BD98 8B10             mov edx,[eax]
Project1.dpr.16: TObject(Addr(Obj)^) := nil;
0041BD9A 33C9             xor ecx,ecx
0041BD9C 8908             mov [eax],ecx
Project1.dpr.17: vTmp.Destroy;
0041BD9E 8BC2             mov eax,edx
0041BDA0 B201             mov dl,$01
0041BDA2 8B08             mov ecx,[eax]
0041BDA4 FF51FC           call dword ptr [ecx-$04]
Project1.dpr.19: end;
0041BDA7 5D               pop ebp
0041BDA8 C3               ret 
0041BDA9 8D4000           lea eax,[eax+$00]





AtomicExchange

Код: pascal
1.
2.
3.
4.
procedure FreeAndNil(var Obj);
begin
  TObject(AtomicExchange(Pointer(Obj), nil)).Free;
end;


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Project1.dpr.10: begin
0041BD90 55               push ebp
0041BD91 8BEC             mov ebp,esp
Project1.dpr.11: TObject(AtomicExchange(Pointer(Obj), nil)).Free;
0041BD93 33D2             xor edx,edx
0041BD95 F08710           lock xchg [eax],edx
0041BD98 8BC2             mov eax,edx
0041BD9A E88198FEFF       call TObject.Free
Project1.dpr.12: end;
0041BD9F 5D               pop ebp
0041BDA0 C3               ret 
0041BDA1 8D4000           lea eax,[eax+$00]




Тут то мы и видим заветное приведение TObject.Free


Точно так же, как и в оригинальной функции
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure FreeAndNil(var Obj);
{$IF not Defined(AUTOREFCOUNT)}
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;
{$ELSE}
begin
  TObject(Obj) := nil;
end;
{$ENDIF}



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Project1.dpr.17: begin
0041BD90 55               push ebp
0041BD91 8BEC             mov ebp,esp
Project1.dpr.18: Temp := TObject(Obj);
0041BD93 8B10             mov edx,[eax]
Project1.dpr.19: Pointer(Obj) := nil;
0041BD95 33C9             xor ecx,ecx
0041BD97 8908             mov [eax],ecx
Project1.dpr.20: Temp.Free;
0041BD99 8BC2             mov eax,edx
0041BD9B E88098FEFF       call TObject.Free
Project1.dpr.21: end;
0041BDA0 5D               pop ebp
0041BDA1 C3               ret 
0041BDA2 8BC0             mov eax,eax




Подмечаем тот факт, что никаких приведений не было. В любом случае, объект лежит в eax
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950658
Добавлю сами вызовы

Из поста
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Project1.dpr.26: t := TObject.Create;
0041E5A4 B201             mov dl,$01
0041E5A6 A150144000       mov eax,[$00401450]
0041E5AB E84070FEFF       call TObject.Create
0041E5B0 A3DC684200       mov [$004268dc],eax
Project1.dpr.27: FreeAndNil(t);
0041E5B5 B8DC684200       mov eax,$004268dc
0041E5BA E8D1D7FFFF       call FreeAndNil
0041E5BF 33C0             xor eax,eax




AtomicExchange
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Project1.dpr.19: t := TObject.Create;
0041E5A4 B201             mov dl,$01
0041E5A6 A150144000       mov eax,[$00401450]
0041E5AB E84070FEFF       call TObject.Create
0041E5B0 A3DC684200       mov [$004268dc],eax
Project1.dpr.20: FreeAndNil(t);
0041E5B5 B8DC684200       mov eax,$004268dc
0041E5BA E8D1D7FFFF       call FreeAndNil
0041E5BF 33C0             xor eax,eax




Оригинал
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Project1.dpr.31: t := TObject.Create;
0041E5A4 B201             mov dl,$01
0041E5A6 A150144000       mov eax,[$00401450]
0041E5AB E84070FEFF       call TObject.Create
0041E5B0 A3DC684200       mov [$004268dc],eax
Project1.dpr.32: FreeAndNil(t);
0041E5B5 B8DC684200       mov eax,$004268dc
0041E5BA E8D1D7FFFF       call FreeAndNil
0041E5BF 33C0             xor eax,eax




Вызов идентичный.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950662
inline из поста
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Project1.dpr.26: t := TObject.Create;
0041E5A4 B201             mov dl,$01
0041E5A6 A150144000       mov eax,[$00401450]
0041E5AB E84070FEFF       call TObject.Create
0041E5B0 A3DC684200       mov [$004268dc],eax
Project1.dpr.27: FreeAndNil(t);
0041E5B5 833DDC68420000   cmp dword ptr [$004268dc],$00
0041E5BC 7414             jz $0041e5d2
0041E5BE A1DC684200       mov eax,[$004268dc]
0041E5C3 33D2             xor edx,edx
0041E5C5 8915DC684200     mov [$004268dc],edx
0041E5CB B201             mov dl,$01
0041E5CD 8B08             mov ecx,[eax]
0041E5CF FF51FC           call dword ptr [ecx-$04]
0041E5D2 33C0             xor eax,eax[code]



inline AtomicExchange
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Project1.dpr.19: t := TObject.Create;
0041E5A4 B201             mov dl,$01
0041E5A6 A150144000       mov eax,[$00401450]
0041E5AB E84070FEFF       call TObject.Create
0041E5B0 A3DC684200       mov [$004268dc],eax
Project1.dpr.20: FreeAndNil(t);
0041E5B5 33C0             xor eax,eax
0041E5B7 F08705DC684200   lock xchg [$004268dc],eax
0041E5BE E85D70FEFF       call TObject.Free
0041E5C3 33C0             xor eax,eax



inline org
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Project1.dpr.30: t := TObject.Create;
0041E5A4 B201             mov dl,$01
0041E5A6 A150144000       mov eax,[$00401450]
0041E5AB E84070FEFF       call TObject.Create
0041E5B0 A3DC684200       mov [$004268dc],eax
Project1.dpr.31: FreeAndNil(t);
0041E5B5 A1DC684200       mov eax,[$004268dc]
0041E5BA 33D2             xor edx,edx
0041E5BC 8915DC684200     mov [$004268dc],edx
0041E5C2 E85970FEFF       call TObject.Free
0041E5C7 33C0             xor eax,eax

...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950665
Как по мне, мне в любом случае нравится lock xchg от AtomicExchange ибо ручками написать

Код: pascal
1.
2.
    t.Free;
    t := nil;



В реально рабочем коде, он всё равно вставит свою mov eax,ebx

Код: sql
1.
2.
3.
4.
Project1.dpr.31: t.Free;
0041E5F4 8BC3             mov eax,ebx
0041E5F6 E82570FEFF       call TObject.Free
0041E5FB 33C0             xor eax,eax

...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950677
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov,

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

Удаляй Delphi. Это тебе не паскаль. Это Delphi) Какой смысл использовать язык Delphi))))
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950726
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

https://en.wikipedia.org/w/index.php?title=Delphi_language&redirect=no

Открой и окатись знанием. Языка "Delphi" больше не существует.

На этом все, или еще идиотские комментарии будут?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950730
rgreat,

Ахахах)))) Смешно - смешно. Его не может Не существовать

https://ru.wikipedia.org/wiki/Delphi_(язык_программирования)


Выпуск Delphi 10.3.2 Rio (18 июля 2019)


Ты хоть понимаешь, что сам компилятор Ну ОН СОВЕРШЕННО ничего общего не имеет с паскалевским.


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

Смешной ты типок.


"Этот язык программирования является диалектом языка Object Pascal." Из Вики
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950732
Да, именно что. В Delphi совершенно не имеет ничего общего к компилятору Паскаля.

Схожий только синтаксис.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950734
По твоей логики. Завтра Какой то Вася выпускает диалект языка Паскаля.

А к вечеру все такие - ГОУ Его в рейтинг вместе с Pascal\Delphi\И какашка выполняющая аналог паскаля.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950749
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Вообще это все не интересно.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39952225
zedxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторEmbarcadero changed the signature of FreeAndNil() in 10.4 Denali:
procedure FreeAndNil(const [ref] Obj: TObject); inline;

https://github.com/IndySockets/Indy/commit/96efd9d4b381ae8531f4756943eb083a41091dcd#diff-fa875d4568a8bcd0f0d1d80726182cdbR1923
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39952241
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читают SQL.ru!
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39952242
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zedxxx
авторEmbarcadero changed the signature of FreeAndNil() in 10.4 Denali:
procedure FreeAndNil(const [ref] Obj: TObject); inline;

Напомните, а что выделенное дает?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39952253
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд
zedxxx
пропущено...

Напомните, а что выделенное дает?
обязательную передачу параметра по ссылке
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39952254
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Принудительно передает параметр по ссылке, независимо от типа.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953410
rashid.abzalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim RusovЧитают SQL.ru!
Это старый тикет - RSP-27208 .
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953415
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот вариант FreeAndNil позволяет его вызывать с не-lvalue, как то свойства, результаты функций. Но если выбирать между type-safety и lvalue-safety, то я однозначно за type-safety. Сколько багов в мире существует из-за этого ...
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953422
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev
Этот вариант FreeAndNil позволяет его вызывать с не-lvalue, как то свойства, результаты функций.

Имхо, это ничем не плохо и в некоторых редких ситуациях удобно. Ровно как и оригинальный вариант - ничем не плох и в некоторых ситуациях удобен. Лично по мне, всё это "улучшение" сугубо теоретическое, на практике FreeAndNil более чем хорош, проблем с ним я в жизни не видел, и чтобы их организовать, нужно такое выдающееся головотяпство, что, мягко говоря, не на зеркало стоит пенять.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953486
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе повезло, что ты с ним никогда проблем не видел. Не все такие визучие ...

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

То что новый вариант не lvalue-safe, приведет к другим багам, но в меньшем кол-ве.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953544
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev
Тебе повезло, что ты с ним никогда проблем не видел. Не все такие визучие ...

Месяца через три после того, как я в первый раз стал начальником отдела, я встал перед необходимостью уволить двоих программистов. На их примере я выработал простой принцип: не брать себе в подчинение тех людей, которых не я собеседовал и не я выбирал. С тех пор, то есть уже где-то шестнадцать лет, я не уволил ни одного человека. Необходимости не было. Видимо, тех, с кем она возникла бы, я отсеиваю ещё на собеседовании. Очень везучий.

Dmitry Arefiev
Классический пример - был класс, его рефакторили в интерфейс, про FreeAndNil забыли или не все места нашли.

Это да, такими странными вещами я не занимаюсь. В том числе поэтому мне и везёт.

Dmitry Arefiev
То что новый вариант не lvalue-safe, приведет к другим багам, но в меньшем кол-ве.

Если налить в чайник раствор серной кислоты и прокипятить, довольно велик риск неприятных последствий. Но это не значит, что чайник плох и приводит к багам.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953550
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так разговор не про крайние случаи, типа серная кислота в чайник, а про среднюю температуру по больнице. Ты имеешь право, как везучий, определить FreeAndNil как тебе удобнее, или ожидать от своих правильного использования. Эмба же не начальник никому, поэтому улучшили определение ...
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953556
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да улучшила и улучшила, почему бы и нет. Ну, может, отвалится какой-нибудь код двадцатилетней давности, типа FreeAndNil(TreeNode.Data), так, мягко говоря, не жалко. Просто, имхо, здесь нечего обсуждать на три страницы.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953703
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Да улучшила и улучшила, почему бы и нет. Ну, может, отвалится какой-нибудь код двадцатилетней давности, типа FreeAndNil(TreeNode.Data), так, мягко говоря, не жалко. Просто, имхо, здесь нечего обсуждать на три страницы.

А FreeAndNil(TObject(TreeNode.Data)) прокатит?.. И разве Pointer можно передать как 'var Obj: TObject' ?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953720
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
softwarer
Да улучшила и улучшила, почему бы и нет. Ну, может, отвалится какой-нибудь код двадцатилетней давности, типа FreeAndNil(TreeNode.Data), так, мягко говоря, не жалко. Просто, имхо, здесь нечего обсуждать на три страницы.

А FreeAndNil(TObject(TreeNode.Data)) прокатит?..

Думаю, прокатит. И это будет хорошо и правильно.

alekcvp
И разве Pointer можно передать как 'var Obj: TObject' ?

Я лет двадцать не смотрел в декларацию FreeAndNil. Мои воспоминания о том, что там просто бестиповая переменная, отстали от жизни? Насколько я помню, var мешает употребить там TObject.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953757
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
И разве Pointer можно передать как 'var Obj: TObject' ?

Я лет двадцать не смотрел в декларацию FreeAndNil. Мои воспоминания о том, что там просто бестиповая переменная, отстали от жизни? Насколько я помню, var мешает употребить там TObject.[/quot]
Да, действительно, там просто var Obj; ...
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953780
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
А FreeAndNil(TObject(TreeNode.Data)) прокатит?

Проблема в том, что он может и откомпилируется, но будет тихо глючить. Типа объект уничтожается, а Data не обнуляется. По крайней мере одну такую ошибку я словил. Глюк в компиляторе, наверное. Так что я остановился на таком варианте:

procedure FreeObj(const [ref] Obj :TObject); overload; inline;
procedure FreeObj(const [ref] Obj :Pointer); overload; inline;

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

Код: pascal
1.
2.
TObject(TreeNode.Data).Free;
TreeNode.Data:=nil;


Зачем нужен этот кривой костыль с FreeAndNil?
Неужели это все только ради того чтобы одну строчку сэкономить?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953789
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Что мешает просто сделать:

Код: pascal
1.
2.
TObject(TreeNode.Data).Free;
TreeNode.Data:=nil;


Зачем нужен этот кривой костыль с FreeAndNil?
Неужели это все только ради того чтобы одну строчку сэкономить?


этот вопрос и меня занимает)
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953791
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не используете - проходите мимо. Не мешайте ценителям обсуждать высокие материи.

1. FreeAndNil имеет эстетическую ценность.

2. В нем большой практический смысл, заключающийся в локальной переменной. Просто вы его еще не постигли (кажется я это уже писал?...)
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953802
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Что мешает просто сделать:

Код: pascal
1.
2.
TObject(TreeNode.Data).Free;
TreeNode.Data:=nil;


Зачем нужен этот кривой костыль с FreeAndNil?
Неужели это все только ради того чтобы одну строчку сэкономить?

Что будет, если внутри TObject(TreeNode.Data).Destroy случится исключение?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953803
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Если может случится исключение то ясное дело что его надо обрабатывать.

Как и в случе FreeAndNil.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953804
rgreat

Зачем нужен этот кривой костыль с FreeAndNil?


Как он может быть кривым? По твоей логике, все функции кривые. Которые требуют правильного заполнения. Которые ты можешь неверно заполнить, или неверно передать значение.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953805
Возможно rgreat когда то обжёгся в сях с макросами, а в сях с плюсами с шаблонами. Теперь они универсальные функции боится как раскалённой палки, которая бьёт по спинке ломая хребет
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953806
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Как он может быть кривым?
Просто.

Проблемы разных реализаций и применений этой процедуры тут уже несколько страниц обсуждают.

Не говоря уже о том что при вгляде на содержимое этой процедуры меня просто эстетически корежит.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953820
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
alekcvp,
Если может случится исключение то ясное дело что его надо обрабатывать.
Как и в случе FreeAndNil.

Только в случае FreeAndNil() указатель будет обнулён, а в вашем варианте - нет.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953823
rgreat,

Ой да ладно. Корёжит вас. Компилятору как то, ну вообще пофиг. Что вы напишите ручками, что вы заюзаете данную функцию. По итогу будет аналогичный код.


А то что, кто - то не внимательный, и пихает в неё всё подряд - это его вина.


Такой человек вообще, вряд - ли напишет рабочий продукт хотя бы на 2% И уже проблема не в функции.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953824
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Указатель-то обнулен, а вот сам объект не[до]освобожден.
Вот и думай. что хуже.))
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953825
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Только в случае FreeAndNil() указатель будет обнулён, а в вашем варианте - нет.
Так это то как раз очень плохо.
Очистка объекта не завершена а указатель уже обнулен.

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

Нечего думать. Необнулённый указатель гораздо хуже.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39953947
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Vlad F
Указатель-то обнулен, а вот сам объект не[до]освобожден.
Вот и думай. что хуже.))

Нечего думать. Необнулённый указатель гораздо хуже.

И это всего лишь твое неподкрепленное частное мнение.))
...
Рейтинг: 0 / 0
Улучшил 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
Улучшил FreeAndNil. Можете не благодарить.
    #39954244
alekcvp,

Да хватит пургу гнать. В команде всякое бывает. Классы могут крашитья по разным причинам. Освобождение тоже может происходить спонтанно из за освобождения логики определённого юнита хаотичным образом, из за порядка подключения.

Да куча вообще есть подводных комней, почему лучше удалить с пометкой указателя на null


Вот один пример - порча памяти приложения

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    for I := 0 to T.UnitCount - 1 do
    begin
      len := PByte(p)^;
      if len <> 0 then
      begin
        SetLength(UnitList[I], len);
        len2 := Utf8ToUnicode(@UnitList[I][1], len + 1, @p[1], len);
        if len2 > 0 then
          SetLength(UnitList[I], len2 - 1)
        else
          UnitList[I] := '';
      end;

      Inc(p, sizeof(Byte));
      Inc(p, len);
    end;



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

Подправив его вот так, у нас перестали крашиться обращения к классам хаотичным образом
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    Offset := 0;
    for I := 0 to UnitsCount - 1 do
    begin
      len := PByte(NativeInt(P) + Offset)^;
      if len = 0 then
        Continue;

      Inc(Offset, 1);

      SetLength(Units[I], len);
      Move(Pointer(NativeInt(P) + Offset)^, Units[I][1], len);

      Inc(Offset, len);
    end;

...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954245
Надо мыслить на много шире. Приведённые примеры не означают что будет именно так. Так как в действительности - в реальных условиях, я бы даже сказал в суровых. Детская фантазия не всегда поможет. Постоянно может возникать что - то, о чём вы даже не могли и предположить.

Так что Я не могу понять, почему обнуление 1 указателя функцией FreeAndNil с последующими возможными ссылками, и конечным освобождённым объектов - для вас какой - то ужас.

Я могу предположить что у вас просто нехватка реального опыта с разными проблемами в настоящих проекта (Не подделках в детском саду)
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954246
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Постоянно может возникать что - то, о чём вы даже не могли и предположить.

Это говорит о недостатке опыта вкупе с тягой к экспериментам.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954247
rgreat,

Шаблоньюзер
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954248
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Постоянно может возникать что - то, о чём вы даже не могли и предположить.
Так что Я не могу понять, почему обнуление 1 указателя функцией FreeAndNil с последующими возможными ссылками, и конечным освобождённым объектов - для вас какой - то ужас.

Когда в приложении происходит хрен знает что и вы вообще не представляете что там и где освобождается, то проблема не во FreeAndNil, а в архитектуре приложения...
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954267
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp, rgreat

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

Разница в том, что вы зачем-то используете Utf8ToUnicode куда надо передавать какие-то указатели...

А мы работаем с высокоуровневым кодом, и делаем это проще через
Код: pascal
1.
2.
var SourceBuffer, TargetBuffer: TBytes;
TargetBuffer := TEncoding.Convert(TEncoding.UTF8, TEncoding.Unicode, SourceBuffer);



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

Данный код, кто - то вытянул из Delphi какой - то версии. В последней версии, вроде как стоит
Код: pascal
1.
2.
3.
    p := Pointer(FTypeInfo^.UnitNames);
    for i := 0 to FTypeInfo^.UnitCount - 1 do
      Result[i] := ReadShortString(p);




Проблема не в Utf8ToUnicode, ибо она была ликвидирована в первую очередь по такой же причине. Спойлер - проблема не исчезла.

Код: pascal
1.
 P := Pointer(T.UnitNames);



В оригинале, в Delphi коде делался inc на переменную P дабы разграничить секции. И каким - то образом, двигался не Pointer указателя, а именно сам UnitNames.

Код: pascal
1.
UnitNames: _PShortStr; { concatenation of Pascal strings, one for each unit }




Хотя, в новой реализации функция ReadShortString тоже двигает указатель.

Странно это.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954370
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

Не вижу свзи между безопастностью и freeandnil.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954425
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

не видишь, предложи замену
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954427
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

Код: pascal
1.
2.
3.
4.
5.
try
  X.Free;
finally
  X:=nil;
end;


Ошибки обработать по желанию/необходимости.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954437
По моему вы преувеличиваете

Код: 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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  Test = class
    procedure Test;
    destructor Destroy; override;
  end;

var
  Form1: TForm1;
  Test1: Test;

implementation

{$R *.dfm}

procedure ExceptionCall;
begin
  Raise Exception.Create('Исключение пифеца');
end;

procedure Test.Test;
begin
  ExceptionCall;
end;

destructor Test.Destroy;
begin
  Test;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Try
    FreeAndNil(Test1);
  Except
    on E: Exception do
      ShowMessage(E.ClassName + ' ошибка с сообщением : ' + E.Message);
  end;

  if Test1 = nil then
    ShowMessage('Обнулён');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Test1 := Test.Create;
end;

end.




Объект обнулён в любом случае.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954438
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
kealon(Ruslan),

Код: pascal
1.
2.
3.
4.
5.
try
  X.Free;
finally
  X:=nil;
end;


То есть, если в программе пятьсот мест, где нужно подобным образом освободить объект, Вы пятьсот раз напишете этот код? Или же таки оформите процедуру и вызовете её пятьсот раз?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954439
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

Как я уже сказал я крайне редко обнуляю указатели как таковые ибо считаю это непрямым и как следствие ненадежным методом контроля состояния объекта.
Ссылок на объект может быть больше одной.

У меня в 99% случаев nil в указателе может быть только до иннициализации объекта.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954440
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объекты я убычно убиваю вместе с бизнес логикой и всеми ссылками, которе на него ссылаются.

Так проверять на валидность ничего и не надо.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954442
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Как я уже сказал я крайне редко обнуляю указатели как таковые

Вы не ответили на вопрос. Руслан Вас спросил, Вы предложили метод, я задал вопрос про этот метод. В нём нет ничего про крайне редко или крайне часто, в нём только про методику использования предложенного Вами метода.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954445
Как показала практика, для обнуление объекта try не нужно. И со всеми задачи справляется FreeAndNil




А если нужен try то и FreeAndNil со всем справляется.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954446
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обнуление переменной до Destroy делается совсем не для обработки исключений. Исключений в деструкторе вообще быть не должно. Это делается, чтобы во время уничтожения объект был недостижим через ссылку, потому что он находится уже в неконсистентном состоянии. Для многих ситуаций это критически важно, и если ссылку не обнулить _до_ Destroy программа будет глючить.

Конечно, в первую очередь это имеет смысл для интерфейсов - обнуление интерфейсной переменной работает так-же как FreeAndNil - для объектов обнуляемая ссылка не факт, что последняя и объект может быть достижим через другие ссылки. Но тем не менее - это принципиальный момент.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954451
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov,

А кто сказал, что обнуление переменной до Destroy делается для обработки исключений?
Эк, вас всех, парни, однако, разобралО.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954452
Vlad F,

Раз 22126803
Два 22127835


В общем тут каждый друг друга путает, наводит кипишь на пустом месте. И из маленькой пылинки раздувает опухоль со слона.

Мифы создают
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954453
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Санитары, как вижу, не справились. Вызывайте уже пожарных что-ли.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954455
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

Еще раз.
Метод вообще на мой взгляд не нужен, по этому на мой обсуждать какой из них лучше это не.более чем разминка для мозга.

Такое мнение.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954456
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov
Исключений в деструкторе вообще быть не должно. .
А бывают.
Я у себя в сервисах try-ями обкладываю вообще все.
Даже то что сломаться якобы не может.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954457
rgreat,

Я буду прост. - Это диагноз.


Vlad F
Санитары, как вижу, не справились. Вызывайте уже пожарных что-ли.


Переборщили с вами.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954458
В общем кого - то надо отправить повторно изучать Try-Except-on&do ибо я сейчас пытаюсь вызвать исключение в конструкторе с выкидом в деструктор, и в нём же созданием исключения разными способами.

И Try-Except-on&do справляется с отловом исключения через овер 100 функций и классов, находя место исключения с использованием разного в том числе и FreeAndNil c пометкой EInvalidPointer с сообщением : Invalid pointer operation


Проблем нет, кривизна функции FreeAndNil не доказана. А польза 100% тем более это inline и не является функцией в рабочем коде.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954479
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
kealon(Ruslan),

Код: pascal
1.
2.
3.
4.
5.
try
  X.Free;
finally
  X:=nil;
end;


Ошибки обработать по желанию/необходимости.
Free это более старый и ненадёжный костыль, чем FreeAndNil
вот он уже точно нигде не нужен
Какой смысл устраивать себе мазохизм?

когда появился FreeAndNil, на своём первом крупном проекте, я отловил кучу ошибок с помощью него

rgreat
alekcvp
Только в случае FreeAndNil() указатель будет обнулён, а в вашем варианте - нет.
Так это то как раз очень плохо.
Очистка объекта не завершена а указатель уже обнулен.

Мы имеем утечку памяти и все предпосылки к сбою, в случае если если это не до убитый поток или нечто с этим связанное.

и толку вам от ссылки на недобитый объект?
идеальный вариант в этом случае, в подавляющем большинстве вариантов: приложение должно падать с багрепортом.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954483
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
Free это более старый и ненадёжный костыль, чем FreeAndNil
вот он уже точно нигде не нужен

Появление Free обусловлено, скажем так, особенностью языка, когда деструктор может быть вызван у недоконструированного объекта. А появление FreeAndNil обусловлено особенностями некоторых индивидов.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954496
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Метод вообще на мой взгляд не нужен

По поводу "не нужен" я уже высказался выше. Я слышал много таких теорий, практически обо всём. Что исключения не нужны и вредны, например, мне тоже доказывали прямо здесь.

rgreat
по этому на мой обсуждать какой из них лучше это не.более чем разминка для мозга.

Так кто же мешает в рамках разминки для мозга ответить на заданный вопрос?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954531
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
идеальный вариант в этом случае, в подавляющем большинстве вариантов: приложение должно падать с багрепортом.

Падающее приложение в подавляющем большинстве вариантов максимально далеко от идеала.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954534
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
А бывают
видно тертого у меня вот свои rdm например рушатся так чтобы добивать все что на них раскидано даже если что-то из разложенного при своем разрушении таки выбросило, ибо всякое бывает
Kazantsev Alexey
появление FreeAndNil обусловлено особенностями некоторых индивидов
и пояснялось тут неоднократно, с цитированием некогда причастных
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954714
vavan,

Вы просто в одном месте вешаете Try-Except-on&do и оно уже за всем следит. Можно даже глобально установится свой обработчик.

Но суровые - тёртые колочи, на каждый пшик вешают Try-Except-on&do
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954721
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тертым калачам надо обработчик ошибки писать в зависимости от места.
А не один на всех.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954723
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Так кто же мешает в рамках разминки для мозга ответить на заданный вопрос?

Да как-то даже душа не лежит в этом рытся. Хорошего решения-то нет.

Обработчик ошибок в нее нормально не встроить, а без этого она в общем виде мне нафиг не нужна.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954725
rgreat,

Ошибка может случится где угодно, в любом месте - в зависимости от погонных условий.

1000 обработчиков велишь пихать? Обработчик нужен чисто - для выявления проблемы, под отладкой можно найти место ошибки (Хотя я сомневаюсь что вы удосужитесь освободить указатель, и нарвётесь на кучу других проблем, и вам это никак не поможет)


На крайняк всегда должен висеть Application.OnException
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954731
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Спасибо за советы, но я как-нибудь сам.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954735
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Да как-то даже душа не лежит в этом рытся. Хорошего решения-то нет.

То есть, Вы дали плохое решение?

rgreat
Обработчик ошибок в нее нормально не встроить, а без этого она в общем виде мне нафиг не нужна.

Это, кстати, довольно характерная черта велосипедов из 22127447 . Для решения простой задачи люди пишут уйму сложного кода, будучи свято уверены в том, что это их эксклюзивное ноу-хау для сложных задач.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954737
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
То есть, Вы дали плохое решение?
То что я дал - это не решение, это его частный случай или даже его часть.

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

Если деструктор дергает обработчик события, из которого идет обращение к переменной класса (довольно распространенная ситуация на самом деле), получаем AV, которого не было при простом вызове Free и последующем занулении. Так что бездумно использовать ее не стоит.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954864
misha mike,

ДезИнформация! Ибо в любом случае ты обнуляешь глобальную переменную, к которой обращаешься из обработчика.

Передавай в обработчик объект this(self) класса, а не обращайся глобально.


Опять проблема функции - не доказана. Доказана кривизна рук.
Код: 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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TTest = class
    procedure Test;
    constructor Create;
    destructor Destroy; override;
    procedure CallHandler(Sender: TObject);
  private
    FOnTest: TNotifyEvent;
  public
    Tick: Integer;
    TestStr: string;
    TestArr: TArray<Integer>;

    property OnTest: TNotifyEvent read FOnTest write FOnTest;
  end;

var
  Form1: TForm1;
  Test1: TTest;

implementation

{$R *.dfm}

procedure TestCallBack(Test1: TTest);
begin
  Test1.OnTest(Test1);
end;

procedure TTest.CallHandler(Sender: TObject);
var
  cl: TTest;
begin
  cl := TTest(Sender);

  for VAR I := Low(cl.TestArr) to High(cl.TestArr) do
  begin
    Tick := (cl.TestArr[I] * 2) - TestArr[I];
  end;
  TestStr := TestStr + Tick.ToString;
end;

procedure TTest.Test;
begin
  TestCallBack(self);
end;

constructor TTest.Create;
begin
  Tick := 0;
  OnTest := CallHandler;

  SetLength(TestArr, Random(100));
  for var I := Low(TestArr) to High(TestArr) do
    TestArr[I] := I * 2;

  TestStr := 'Count := ' + Length(TestArr).ToString;
end;

destructor TTest.Destroy;
begin
  Test;
  ShowMessage(TestStr);
  SetLength(TestArr, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Try
    FreeAndNil(Test1);
  Except
    on E: Exception do
      ShowMessage(E.ClassName + ' ошибка с сообщением : ' + E.Message);
  end;

  if Test1 = nil then
    ShowMessage('Обнулён');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Test1 := TTest.Create;
end;

end.

...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954865
В принципе то мне понятно почему изначально в ОПП обработчиков вкладывался Sender: TObject что бы всегда иметь ссылку на свой класс. Но многие стесняются использовать драгоценный Sender as TClass, и передавать куда угодно, и там же использовать. Не имея ссылок на глобальные переменные класса


Пиля сук на котором стоишь, ты в любом случае роешь себе могилу. И неважно что ты используешь, включая FreeAndNil

Тут как говорится - или рыбку съесть(Передать указатель), или на кол сесть (Всё равно обнулить переменную)
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954876
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike
Сабжевая функция при всей своей относительной полезности и кажущейся безобидности имеет один неприятный сайд-эффект.

Если деструктор дергает обработчик события, из которого идет обращение к переменной класса (довольно распространенная ситуация на самом деле), получаем AV, которого не было при простом вызове Free и последующем занулении. Так что бездумно использовать ее не стоит.
так в этом и весь цимес :-)
какой смысл от наполовину разрушенного объекта?

объект пошёл на удаление - нефиг к нему лезть по глобальным переменным, только по эксклюзивному доступу (передавая указатель на себя) подписчикам, собственно как в 22128594
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954892
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike
(довольно распространенная ситуация на самом деле)

Тем, у кого она распространена, стоит задуматься о степени служебного соответствия.

misha mike
получаем AV, которого не было при

И хорошо. Это отличная удобная индикация проблемы, которая возникает в 100% случаев, правится за пару минут и при наличии хотя бы минимального тестирования не имеет практических шансов дойти до продакшна. Так гораздо лучше, чем позволить программе рандомное удовольствие работы с внутренностями полуосвобождённых объектов и выгребать ситуации типа "компилирую в debug - всё хорошо, а собираю release - и на проде вываливается проблема".
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954942
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё так. Не существует ни одной причины хранить зомби-ссылки. Как бы тут ни старались убедить в обратном.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954944
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Во-первых, не всегда Sender равен уничтожаемому объекту. Даже в стандартных компонентах это часто инкапсулированный объект, который не факт, что имеет ссылку на хозяина.

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

Каждый инструмент имеет свою область применения, FreeAndNil не является универсальным способом уничтожения объекта, точка.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954949
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Так гораздо лучше, чем позволить программе рандомное удовольствие работы с внутренностями полуосвобождённых объектов и выгребать ситуации типа "компилирую в debug - всё хорошо, а собираю release - и на проде вываливается проблема".

О каком полуосвобождении идет речь? Вызов обработчика из деструктора -- совершенно нормальная практика. А что будет в обработчике, не всегда известно тому, кто этот обработчик пишет. Там может быть вызов пользовательского скрипта, который не определен на этапе разработки программы.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954950
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon
Всё так. Не существует ни одной причины хранить зомби-ссылки. Как бы тут ни старались убедить в обратном.

А кто говорит про зомби? Пока не отработал деструктор, ссылка остается вполне актуальной.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954958
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike
makhaon
Всё так. Не существует ни одной причины хранить зомби-ссылки. Как бы тут ни старались убедить в обратном.

А кто говорит про зомби? Пока не отработал деструктор, ссылка остается вполне актуальной.

Т.е. пока работает деструктор, то объект по этой ссылке можно дёргать из другого потока, например?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954962
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike
О каком полуосвобождении идет речь?

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

misha mike
Вызов обработчика из деструктора -- совершенно нормальная практика. А что будет в обработчике, не всегда известно тому, кто этот обработчик пишет. Там может быть вызов пользовательского скрипта, который не определен на этапе разработки программы.

Угу. Таким образом и появляются программы, которые иногда работают. Например, на одной из работ я столкнулся с тем, что подобные авторы боялись перекомпилировать клиента - потому что компиляция из одних и тех же исходников на одном и том же компьютере с вероятностью порядка 2/3 давала очевидно неработоспособный exe (ну то есть тот, в котором находили грубые ошибки в первые пять-десять минут регресса), а с вероятностью порядка 1/5 - на первый взгляд работоспособный exe (тот, в котором не находили ошибок через час-два регресса). И они несколько лет занимались тем, что старались решить все потребности "скриптами", когда этого не удавалось - отбрыкаться от того, чтобы их делать, а когда не удавалось - вносили изменение и после этого гоняли цикл собрать-тестировать-собрать-тестировать-собрать-тестировать, пока очередное ручное тестирование не говорило, что вроде бы релиз получился жизнеспособным.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954964
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

А при чем тут другой поток? Потокобезопасные классы -- это отдельная большая песня. Речь о таком, вполне однопоточном кейсе:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
destructor TConnection.Destroy;
begin
  if FActive then 
    Close;
  ...
  inherited;
end;

procedure TConnection.Close;
begin
  ...
  if Assigned(FOnClose) then
    FOnClose(...);
end;



У нас из деструктора вызывается внешний обработчик OnClose, который вполне может обратиться к переменной, указывающей на экземпляр TConnection, но которая была обнулена вызовом FreeandNil еще до вызова деструктора.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954967
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer, ваш главный тезис "если вызван деструктор, то экземпляр тут же официально считаестя мертвым" корректен лишь отчасти. В случае класса, где из деструктора вызывается обработчик события, логично ожидать, что на момент вызова обработчика класс все еще находится во вменяемом состоянии и к нему можно так или иначе обратиться.

Что касается логики работы FreeAndNil, то она в стремлении не допустить даже кратковременного существования ссылки на мертвый объект, улетает в другую крайность: допускает существование живого и еще работающего объекта при мертвой ссылке. И это тоже неконсистентное состояние программы, хоть и несущее меньше потенциальных проблем.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954971
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
объект пошёл на удаление - нефиг к нему лезть по глобальным переменным, только по эксклюзивному доступу (передавая указатель на себя) подписчикам

Это все правильно, но не всегда есть возможность заставить всех так делать. При этом имеем ситуацию, когда Free + nil работает идеально, ничего не течет, не крашится, и "математически" стабильно, а FreeAndNil -- мгновенно AV, которое без переписывания половины проекта не побороть.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954974
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike
В случае класса, где из деструктора вызывается обработчик события, логично ожидать

Прежде всего, "логично ожидать" - это не метод надёжного программирования. Метод надёжного программирования - проверять, убеждаться и стараться строить взаимодействие так, чтобы не сломалось в будущем, когда те или иные аспекты реализации могут и переделать.

Во вторую очередь, к тому объекту, у которого только что вызван деструктор и который ещё находится во вменяемом состоянии, действительно можно обращаться - и на это, как вполне справедливо заметил Няшик, вполне хватит Sender-а. В отношении его окружения, то есть Owner-а, других компонент в том же Owner-е итп. такое утверждение уже неверно, обращаться нельзя. Поэтому вопрос обращения через глобальные переменные неактуален. Вообще, при написании обработчиков типа OnDestroy надо тщательно продумывать, что делаешь, каким способом и нельзя ли это вынести куда-нибудь пораньше.

И наконец, глобальное преимущество FreeAndNil в том, что она оставляет разрушаемый объект в относительно адекватном состоянии в ходе разрушения. То есть, когда случается какая-либо непредусмотренная разработчиками петля, приложение в лучшем случае проверяет на if Assigned и корректно работает дальше, в худшем не проверяет и напарывается на простой и очевидный AV, но не начинает веселухи работы через уже освобождённую память.

misha mike
Что касается логики работы FreeAndNil, то она в стремлении не допустить даже кратковременного существования ссылки на мертвый объект, улетает в другую крайность:

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

misha mike
допускает существование живого и еще работающего объекта при мертвой ссылке. И это тоже неконсистентное состояние программы, хоть и несущее меньше потенциальных проблем.

Оно действительно несёт кардинально меньше потенциальных проблем, это главное (к ранее упоминавшемуся вопросу про правильный порядок действий). Но кроме этого, Вы неправы, называя такое состояние неконсистентным. В том состоянии, о котором идёт речь, затёрты внешние ссылки (и это правильно), но остаются оперативные, недоступные извне - грубо говоря, Self в регистрах и всё, что от него растёт. Это как раз то, что нужно для завершения уничтожения объекта, не более и не менее.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954977
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike
В случае класса, где из деструктора вызывается обработчик события, логично ожидать, что
событие будет называться, хотя бы - "OnDestroing". По-хорошему, деструктор надо держать в чистоте-теплоте-сухости и не вызывать оттуда методы взаимодействия с объектом, а для уведомлений о разрушении - из BeforeDestruction или через FreeNotification.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954978
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike
Что касается логики работы FreeAndNil, то она в стремлении не допустить даже кратковременного существования ссылки на мертвый объект, улетает в другую крайность: допускает существование живого и еще работающего объекта при мертвой ссылке. И это тоже неконсистентное состояние программы, хоть и несущее меньше потенциальных проблем.

Каком образом после FreeAndNil может остаться живой объект?..
А про мёртвую ссылку - при вызове любых событий из деструктора, туда должен передоваться Self как Sender - на это FreeAndNil не влияет никак и ссылка будет жива.
misha mike
У нас из деструктора вызывается внешний обработчик OnClose, который вполне может обратиться к переменной, указывающей на экземпляр TConnection, но которая была обнулена вызовом FreeandNil еще до вызова деструктора.

При чём тут вообще FreeAndNil, если вы его вызываете не вовремя? А если бы вы до вызова деструктора просто .Free вызвали - это было бы корректно что-ли?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954981
misha mike,

Вызов из обработчика, по всем канонам ООП должен обращаться только к своему this(self) объекту. И никогда не обращаться на самого же себя, из глобальной переменной которая будет обнулена.


В данном случае Sender as TClass всегда указывает на текущий класс (Мы не говорим про случае доп классов, на класс)



Если соблюдать каноны, вы бы никогда себе не напридумывали проблем.

1) Ибо вы не можете создать несколько классов - разного типа, 1 класс всегда будет заменять другой, а вы получать пинка.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954982
misha mike
а FreeAndNil -- мгновенно AV



Пожалуйста, приведите пример кода с AV мы все хотим посмотреть, как вы будете создавать 2 класса из 1
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954995
Имеем
1) Класс 1 который ссылается на переменную глобальную класса 1
2) Класс 2 который создаются отдельно, и ссылается на переменную класса 1

Вопрос, что будет если Класс 1 не будет инициализирован хотя бы nil ?

И как итог - если Класс 2 будет освобождён, то он обратится к переменной класса 1.

И в конечном - увольнение с работы за дилетантство.

Не устраиваете на работу к себе misha mike, ибо любитель статичных костылей и незнания стандартных ООП применений (Класс должен быть унивирсальным)
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955014
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный, как хорошо, что ваше мнение никого не волнует.

Еще раз для всех собравшихся. Речь не идет об обращении к глобальной переменной класса прямо из обработчика. Речь идет о проекте на миллион строк, где черт ногу сломит, где в том числе работает и написанный пользователем код, где стек вызовов из обработчика имеет сотню уровней. И в этом коде не происходит обращения к мертвым объектам, но возможны обращения к глобальным переменным, потому что никто не тащил Sender через весь стек вызовов. Проект работает идеально, но простая замена Free + nil на FreeAndNil делает его неработоспособным и реального пути исправить это нет. Не протащить Sender каждого обработчика во все уголки, да еще так, чтобы пользовательский код в нужный момент обращался именно к нему, а не к переменной из global scope.

И именно об этом я написал в первом сообщении. Констатировал факт, что FreeAndNil <> Free + nil, и это иногда вылазит из неожиданных мест. В мире розовых пони FreeAndNil делает зашибись и избавляет от массы проблем, но реальность суровее.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955016
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike
kealon(Ruslan)
объект пошёл на удаление - нефиг к нему лезть по глобальным переменным, только по эксклюзивному доступу (передавая указатель на себя) подписчикам

Это все правильно, но не всегда есть возможность заставить всех так делать. При этом имеем ситуацию, когда Free + nil работает идеально, ничего не течет, не крашится, и "математически" стабильно, а FreeAndNil -- мгновенно AV, которое без переписывания половины проекта не побороть.
проект явно в запущеном состоянии, с глубоким техническим долгом

для этого однозначно программист нужен, пробовали нанять?

поиск ошибок с порчей памяти куда дороже обходится чем AV
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955055
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А бездумное напихивание FreeAndNil - тоже заставляет задуматься о том, что программист не вполне уверен в своём коде и закладывается на AV как показатель бага, который не спорю, гораздо легче отыскать... И которого, возможно не могло возникнуть при правильной архитектуре))
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955060
misha mike,

Так зачем вы используете классы ? Вам не кажется что классы в вашем проекте - лишнее. Используется object объекты, или record

Вы не можете создать больше 1 класса, не нарушив логику работы двух экземпляров.


Ваш код - говнокод. В помойку.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955062
white_nigger
А бездумное напихивание FreeAndNil - тоже заставляет задуматься о том, что программист не вполне уверен в своём коде и закладывается на AV как показатель бага, который не спорю, гораздо легче отыскать...


Это не Не бездумное напихование, это гарант что программист не забудет обнулить ссылку на объект, который возможно по случайности где - то случайно начнёт использовать когда его не существует. И будет не понимать, почему у него беда


Написать free может каждый, а вот nil сделать - не каждый (Просто забыть)


white_nigger
И которого, возможно не могло возникнуть при правильной архитектуре))


Ну если программист самоучка начал писать свои велосипеды, и в будущем не может от них избавится... Это конечно беда. Ибо в них и вправду чёрт ногу сломишь, из за никого качества кода, и непродуманности

...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955063
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan), там не программист нужен, а волшебник. Точнее, команда волшебников.

А проект работает и продается за очень большие деньги. Просто однажды попробовали сделать по канонам и заменить кое-где Free на FreeAndNil, получили что получили, и откатили назад. Никто все равно не вложил бы кучу денег в переписывание того, что отлично работает.

Мне тот проект давно пофиг на самом деле, я лишь написал, что даже в сбалансированном (пусть и не по канонам писаном) приложении использование FreeAndNil может добавить головняка. Что хотел, сказал.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955066
misha mike,

Мне искренне жаль людей, которые покупают низко качественный продукт за большие деньги. (Возможно и переписать то там возможно за ночь с кружкой кофе не смотря в код, разумеется. Только ТЗ)
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955111
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger
А бездумное напихивание FreeAndNil - тоже заставляет задуматься о том, что программист не вполне уверен в своём коде и закладывается на AV как показатель бага, который не спорю, гораздо легче отыскать... И которого, возможно не могло возникнуть при правильной архитектуре))
расскажи, пожалуйста, обществу какая у вас правильная архитектура

самому то не смешно?
это неплохая защита и от последующих возможно косых изменений, что бы было видно когда забажили
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955119
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
самому то не смешно?
Что должно быть смешно? И что не понятно в моем посте?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955121
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищи, в таком русле ваш спор совершенно пустой.
Бездумное использование FreeAndNil - плохо, конечно.
Бездумное использование молотка тоже плохо, например.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955122
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Товарищи, в таком русле ваш спор совершенно пустой.
Бездумное использование FreeAndNil - плохо, конечно.
Бездумное использование молотка тоже плохо, например.
Полностью согласен. Было забавна потыкать палкой в холивар)) Больше не буду))
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955137
А я ещё раз повторю что, функция FreeAndNil нужна, когда нужно уничтожить объект, и ссылку на него. Что бы не обращаться к удалённому объекту, и не использовать не инициализированный объект.

Если при использование FreeAndNil вы видите ошибку AV, то вы плохой и ужасный программист. В том смысле, что вы заставляете работать класс с 1 экземпляром класса, который нельзя создать в другую переменную - изолировано.

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

Деструктор, должен передавать в свои коллбэки ссылку на this(self) класса. А не ссылатся из коллбэка в глобальную область памяти.

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


Мы говорим о использование FreeAndNil в классовых объектах.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955139
Вот вам презик 100% защиты

Код: 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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
function GetObjectClass(APointer: Pointer): TClass;
{$IFDEF MSWINDOWS}
var
  LMemInfo: TMemoryBasicInformation;

  { Checks whether the given address is a valid address for a VMT entry. }
  function IsValidVMTAddress(APAddress: Pointer): Boolean;
  begin
    { Do some basic pointer checks: Must be dword aligned and beyond 64K }
    if (UIntPtr(APAddress) > 65535) and (UIntPtr(APAddress) and 3 = 0) then
    begin
      { Do we need to recheck the virtual memory? }
      if (UIntPtr(LMemInfo.BaseAddress) > UIntPtr(APAddress)) or ((UIntPtr(LMemInfo.BaseAddress) + NativeUInt(LMemInfo.RegionSize)) < (UIntPtr(APAddress) + SizeOf(Pointer))) then
      begin
        { Get the VM status for the pointer }
        LMemInfo.RegionSize := 0;
        VirtualQuery(APAddress, LMemInfo, SizeOf(LMemInfo));
      end;
      { Check the readability of the memory address }
      Result := (NativeUInt(LMemInfo.RegionSize) >= SizeOf(Pointer)) and (LMemInfo.State = MEM_COMMIT) and
        (LMemInfo.Protect and (PAGE_READONLY or PAGE_READWRITE or PAGE_EXECUTE or PAGE_EXECUTE_READ or PAGE_EXECUTE_READWRITE or PAGE_EXECUTE_WRITECOPY) <> 0) and (LMemInfo.Protect and PAGE_GUARD = 0);
    end
    else
      Result := False;
  end;

{ Returns true if AClassPointer points to a class VMT }
  function InternalIsValidClass(AClassPointer: Pointer; ADepth: Integer = 0): Boolean;
  var
    LParentClassSelfPointer: PPointer;
  begin
    { Check that the self pointer as well as parent class self pointer addresses
      are valid }
    if (ADepth < 1000) and IsValidVMTAddress(Pointer(PByte(AClassPointer) + vmtSelfPtr)) and IsValidVMTAddress(Pointer(PByte(AClassPointer) + vmtParent)) then
    begin
      { Get a pointer to the parent class' self pointer }
      LParentClassSelfPointer := PPointer(PByte(AClassPointer) + vmtParent)^;
      { Check that the self pointer as well as the parent class is valid }
      Result := (PPointer(PByte(AClassPointer) + vmtSelfPtr)^ = AClassPointer) and
        ((LParentClassSelfPointer = nil) or (IsValidVMTAddress(LParentClassSelfPointer) and InternalIsValidClass(LParentClassSelfPointer^, ADepth + 1)));
    end
    else
      Result := False;
  end;

begin
  { Get the class pointer from the (suspected) object }
  Result := TClass(PNativeUInt(APointer)^);
  { No VM info yet }
  LMemInfo.RegionSize := 0;
  { Check the block }
  if not InternalIsValidClass(Pointer(Result), 0) then
    Result := nil;
{$ELSE !MSWINDOWS}
begin
  { Not currently supported under Linux / OS X }
  Result := nil;
{$ENDIF MSWINDOWS}
end;

procedure FreeAndNil(var Obj); inline;
var
  Temp: TObject;
begin
  if GetObjectClass(Pointer(Obj)) <> nil then
  begin
    Temp := TObject(Obj);
    Pointer(Obj) := nil;
    Temp.Free;
  end;
end;



В нём совершенно нет ничего плохого в FreeAndNil. Вы туда не сможете передать ничего, что не имеет класса.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955142
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, спи уже.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955145
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger
А бездумное напихивание FreeAndNil - тоже заставляет задуматься о том, что программист не вполне уверен в своём коде и закладывается на AV как показатель бага, который не спорю, гораздо легче отыскать... И которого, возможно не могло возникнуть при правильной архитектуре))
авторКогда думаешь о том, где баг потенциально может возникнуть, а где нет, появляется опасная иллюзия, что ты держишь ситуацию под контролем, и предусмотрел все кейсы. Я работаю семь лет, ещё ни разу не было такого, чтобы я предусмотрел все кейсы. Потому что это частный случай задачи коммивояжера — ты НИКОГДА не можешь предусмотреть все кейсы. Ты даже самые распространенные и вероятные рассмотреть не можешь. Когда, кто и в какой ситуации напишет код с критичным багом, в каком модуле и как он это сделает — ты, блин, понятия не имеешь. Все, что ты можешь сделать, это уменьшить шансы на появление бага. Вот и уменьшай, тебе за это платят бешеные деньги. https://habr.com/ru/post/500926/
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955146
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955150


Ну не знаю, не знаю.. Что плохого в том, что компилятор за тебя решает как сравнивать типы разного характера 35 = "35str"

Тем более, я более чем уверен что написанное на c++ это делает как

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
bool InlineCmpNode(Nodes Node, byte TypeVar) {
	void *ArrCmpType[3] = {&&CmpInt, &&CmpDouble, &&CmpString};

	goto *ArrCmpType[TypeVar];

	auto Var1 = Node[0];
	auto Var2 = Node[1];

	// Реализация перезагрузки для сравнения с Int и String к примеру (overload in delphi)

	CmpInt:
	 return InlineCmpInt(Var1, Var2);
	 
	CmpDouble:
	 return InlineCmpDouble(Var1, Var2);
	 
	CmpString:
	 return InlineCmpString(Var1, Var2);
}



Данный код, укороченный рабочий прототип одного закрытого проекта.

В данном случае, goto работает никак switch стандартный. А именно jmp OFFSET

Код: sql
1.
2.
3.
4.
5.
6.
7.
        mov     eax, OFFSET FLAT:.L9
        movsx   rsi, esi
        mov     QWORD PTR [rsp-24], OFFSET FLAT:.L11
        movq    xmm0, rax
        movhps  xmm0, QWORD PTR .LC1[rip]
        movaps  XMMWORD PTR [rsp-40], xmm0
        jmp     [QWORD PTR [rsp-40+rsi*8]]



Это чистая адресация, по сравнению с тем, что мы можем видеть при switch
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
        mov     r8d, DWORD PTR [rdi]
        mov     r9d, DWORD PTR [rdi+4]
        cmp     esi, 64
        je      .L13
        cmp     esi, 512
        mov     edi, r8d
        mov     esi, r9d
        jne     .L14
        jmp     InlineCmpInt(auto, auto)



На самом деле сравниваемых типов около 16, это ресурсы \ структуры и прочее. Я оставил только основное, и switch генерирует слишком много cmp что в два раза медленнее работает если сравниваемый объект хранится в конце списка.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955151
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный


Ну не знаю, не знаю.. Что плохого


...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955152
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev
Вам на ночь глядя:
https://www.google.com/search?client=firefox-b-d&q=nick hodges freeandnil

Комментарий на рандомном сайте прикольный:
знаем, знаем. это тот ник, который учит всех не использовать FreeAndNil потому что “а зачем?”. баааальшой спец, которого даже из такой сомнительной конторы как эмбаркадеро поперли.:)
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955155
asviridenkov,

Ну всё правильно для JS если один node является строкой, то происходит concat. Притом, на стадии пред компиляции происходить проверка, является ли строка - строкой ? Или же это число, или что - то ещё.

Но вот для других языков 4 == "4text" будет = true так же как и 8 в сложение. Но вот если строка идёт спереди "text4", то она не является числом, и мы не можем получить concat в виде 44text и получаем просто 4


Это азы, это знать надо перед тем как начать программировать на языке (Уточнив приоритеты)
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955156
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

a+b <> b+a
ну да, все верно.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955158
asviridenkov,

javascript
44 == "44" = true
44 == "44d" = false

Возьмём к примеру php
44 == "44" = true
44 == "44d" = true
44 == "d44" = false

44 + "44" = 88
44 + "44d" = 88
44 + "d44" = 44

Для js будет понятно, что там в любом случае concat string
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955159
В lua к примеру со строкой вообще нельзя сравнить число, будет false
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955179
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, вы немного не в том направлении ушли :) Обсуждение той статьи заслуживает отдельной ветки, даже может быть и в разделе Delphi, но лучше - в разработка, я с ней полностью согласен, но это не тема топика. Ссылка была приведена только для главного посыла:авторПотому что это частный случай задачи коммивояжера — ты НИКОГДА не можешь предусмотреть все кейсы
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955299
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный

44 + "44" = 88
44 + "44d" = 88
44 + "d44" = 44

Пц... и на этом ещё пишут...
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955310
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

раз уж хочется об этом поговорить, можно вот еще пару тем глянуть :)
https://habr.com/ru/post/500098/
https://habr.com/ru/post/500822/
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955337
alekcvp
Пц... и на этом ещё пишут...


Нормально и пишут.Это никаких неудобств не доставляет, зная как с этим работать.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?php
$foo = 1 + "10.5";                // $foo это float (11.5)
$foo = 1 + "-1.3e3";              // $foo это float (-1299)
$foo = 1 + "bob-1.3e3";           // $foo это integer (1)
$foo = 1 + "bob3";                // $foo это integer (1)
$foo = 1 + "10 Small Pigs";       // $foo это integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo это float (14.2)
$foo = "10.0 pigs " + 1;          // $foo это float (11)
$foo = "10.0 pigs " + 1.0;        // $foo это float (11)
?>



Это всё написанно на официальном сайте https://www.php.net/manual/ru/language.types.php
Ознакомление составляет 20 минут в среднем
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955339
Это всё написанно на официальном сайте https://www.php.net/manual/ru/language.types.php
Ознакомление составляет 20 минут в среднем[/quot]


Значение определяется по начальной части строки. Если строка начинается с верного числового значения, будет использовано это значение. Иначе значением будет 0 (ноль). Верное числовое значение - это одна или более цифр (могущих содержать десятичную точку), по желанию предваренных знаком с последующим необязательным показателем степени. Показатель степени - это 'e' или 'E' с последующими одной или более цифрами.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955344
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищи, который топят против FreeAndNil почему-то считают, что если вы его используете - то это только потому, что структура кода требует его использовать. Иными словами, они считают, что если вы используете FreeAndNil - то у вас ужасная неразбериха в коде, вы сами не знаете область жизни ваших объектов.

И в этом они, конечно, правы. Видимость объектов нужно максимально сужать, код нужно упрощать, минимизируя зависимости. Но почему я не могу одновременно иметь нормальную архитектуру и при этом использовать FreeAndNil - мне не понятно.

Я подозреваю, что эти товарищи получили детскую травму, работая с подобным кодом. Это примерно как если бы вы работали с "лапшой на GOTO" и написали "Доводы против оператора GOTO". Просто когда другие читают такие опусы, они не вполне понимают, про что говорит автор, потому что никогда не видели подобного кода - ну и понимают сказанное слишком буквально ("удалите вообще это из языка"). Но я вот, к примеру, не видел на практике ни лапши на GOTO, ни FreeAndNil как затычки (да, может быть, мне повезло), зато видел множество случаев, когда и GOTO и FreeAndNil - уместны.

Аргумент: "если у вас правильная архитектура, то FreeAndNil не нужен". Да, не нужен, но никто же не запрещает. Как они собираются гарантировать "правильность" кода - мне не понятно. Человек склонен совершать ошибки. FreeAndNil - это машина, инструмент, она ошибок не делает. Его вызов не несёт каких-то накладных расходов, чтобы от него избавляться. У нас не так много отладочных инструментов, чтобы добровольно отказываться от них.

Также наблюдается некое двуличие. Многие аргументы "против FreeAndNil" применимы также и к Free. Действительно, очень часто достаточно просто Destroy. Почему анти-FreeAndNil товарищи не топят против Free? Когда вообще вы последний раз задумывались: "хм, а здесь нужен Free или достаточно Destroy?" А зачем тогда вы вообще задумываетесь "хм, а здесь нужен FreeAndNil или достаточно Free?"
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955372
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker
Товарищи, который топят против FreeAndNil почему-то считают, что

Товарищи, которые топят против FreeAndNil, считают, что в автомобиле пристёгивается только тот, кто не умеет водить. Ну а настоящим пацанам западло, корона спадает.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955379
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker
часто достаточно просто Destroy
так некоторые его и юзают где достаточно
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955383
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan
GunSmoker
часто достаточно просто Destroy
так некоторые его и юзают где достаточно

Кстати, хороший вопрос для собеседования.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955394
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

Это только если вам на собеседовании нечем заняться.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955395
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker
Также наблюдается некое двуличие. Многие аргументы "против FreeAndNil" применимы также и к Free. Действительно, очень часто достаточно просто Destroy. Почему анти-FreeAndNil товарищи не топят против Free? Когда вообще вы последний раз задумывались: "хм, а здесь нужен Free или достаточно Destroy?" А зачем тогда вы вообще задумываетесь "хм, а здесь нужен FreeAndNil или достаточно Free?"
просто Free появился раньше, но оказался недостаточно хорош
а потом появилась ему замена, в виде FreeAndNil
практически Free уже не нужен, я не могу придумать ему адекватный кейс для применения
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955397
kv67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan),

Код: pascal
1.
2.
3.
4.
5.
6.
with TSomeObject.Create do
try
  // много кода
finally
  Free;
end;
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955410
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kv67
kealon(Ruslan),

Код: pascal
1.
2.
3.
4.
5.
6.
with TSomeObject.Create do
try
  // много кода
finally
  Free;
end;



Код: pascal
1.
2.
3.
4.
5.
6.
with TSomeObject.Create do
try
  // много кода
finally
  Destroy;
end;
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955415
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)
kv67
kealon(Ruslan),

Код: pascal
1.
2.
3.
4.
5.
6.
with TSomeObject.Create do
try
  // много кода
finally
  Free;
end;




Код: pascal
1.
2.
3.
4.
5.
6.
with TSomeObject.Create do
try
  // много кода
finally
  Destroy;
end;

Delphi жыв!
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955418
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще у всего есть семантика и контракт. Кому это не важно, для того эти три варианта одинаковы. Кому важно, заботится о читаемости и логичности кода, для того эти три варианта существенно разные. Кто ты ? :)
Код: pascal
1.
2.
3.
4.
5.
6.
var
  LObj: TObject;
begin
  LObj := TObject.Create;
  LObj.Destroy;
end;


Код: pascal
1.
2.
3.
4.
5.
6.
var
  LObj: TObject;
begin
  LObj := TObject.Create;
  LObj.Free;
end;


Код: pascal
1.
2.
3.
4.
5.
6.
var
  LObj: TObject;
begin
  LObj := TObject.Create;
  FreeAndNil(LObj);
end;
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955423
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я - тот, кто заботится о качестве продукта. Поэтому в заданных условиях однозначно предпочту четвёртый вариант,

Код: pascal
1.
2.
3.
begin
  TObject.Create.Destroy;
end;
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955424
ЭМ.. Free проверяет существует ли объект, и вызывает Destroy

Так что не имеет никакого смысла вызывать Destroy.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955425
Кот шрёдингера он либо жив, либо мёртв. Никогда нельзя предугадать на 100% всего лишь на 99,999
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955426
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Так что не имеет никакого смысла вызывать Destroy.

Небольшой смысл всё же имеет. За него в коде цепляется глаз, поэтому если хочешь просигнализировать читателю "здесь что-то необычное", стоит предпочесть его Free - как, например, в моей предыдущей реплике.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955429
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Я - тот, кто заботится о качестве продукта. Поэтому в заданных условиях однозначно предпочту четвёртый вариант,

Код: pascal
1.
2.
3.
begin
  TObject.Create.Destroy;
end;


Уникальный путь нормален для России :)
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955487
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker
Это примерно как если бы вы работали с "лапшой на GOTO" и написали "Доводы против оператора GOTO". Просто когда другие читают такие опусы, они не вполне понимают, про что говорит автор, потому что никогда не видели подобного кода - ну и понимают сказанное слишком буквально ("удалите вообще это из языка").
Это была попытка ударить по старым программистам, которые благодаря наличию goto, могли писать на Фортране, используя почти любой язык программирования, чем бесили продвинутую молодежь, которая должна была использовать или развивать их проекты. Там были еще приколы, типа использования массива из нескольких элементов вместо record с таким же количеством полей, имитация common-блоков и т.д. Удар пришелся в пустоту: новые языки появились слишком поздно.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955495
bk0010,

Ну goto это while и for и всё остальное.

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

Ну goto это while и for и всё остальное.

А рекорды это и есть массивы, после компиляции не найдёшь отличий.
Ага, все так. А у любителей PL/1 была еще фишка с absolute (смысл тот же, что и в Паскале, но применялась гораздо чаще).
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955500
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev
Вообще у всего есть семантика и контракт. Кому это не важно, для того эти три варианта одинаковы. Кому важно, заботится о читаемости и логичности кода, для того эти три варианта существенно разные.

Если это важно, никто не мешает делать
Код: pascal
1.
2.
3.
var
  Destroy: procedure(var AObj) = FreeAndNil;
  Free: procedure(var AObj) = FreeAndNil;


Можно даже до D F N сократить, а то кто-то ещё аргумент приводит "Free печатать быстрее".

P.S. Я, может, сильно необъективно смотрю, у меня проф предпосылки: как техподдержке трейсера исключений - часто приходится отлаживать за клиента. Просто иногда действительно прямо уе**ть хочется тому, кто FreeAndNil не поставил.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955501
GunSmoker,

Классы падают хаотично ?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955502
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема, которая находится за секунды, если бы кто-то сильно умный использовал бы FreeAndNil, превращается в многочасовой марафон за багами.

P.S. Также ещё пару раз встречал ситуацию, когда надо дополнить сторонний код, но это сделать невозможно, потому что, опять же, не обнулили поля объекта. Приходится городить монстров по проверке валидности указателя. Хотя тут, конечно, не так однозначно, ибо всегда можно сказать, что подобное расширение автором кода не предусматривалось.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955506
Даже в таком маленьком проекте 3D движка, сделали обнуление полей

https://github.com/seriva/GenesisDevice-2010/blob/63c93cf169a85f5327d36b5e4497811edb60544c/Source/Engine/General/Base.pas#L112


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

Это как раз про то, что я выше назвал "хороший вопрос для собеседования". Более-менее опытный программист знает, что удачный проект живёт своей жизнью и за исключением отдельных узких стабильных случаев "предусматривать" его развитие скорее вредно - всё равно оно пойдёт существенно не так. Если разумная доработка требует несоразмерно больших затрат из-за того, что "автором не предусматривалось" - значит, код плохой.

С Destroy это связано следующим образом. Если соискатель говорит "использую Destroy, потому что здесь никогда не будет nil", следует выяснить, насколько это "никогда" выдержит проверку будущими непредсказуемыми доработками. И если где-нибудь прозвучит "Ну программист же должен был проверить все места, где используется объект, и увидеть, что теперь надо заменить Destroy на Free" - выше мида ему точно делать нечего.

GunSmoker
Я, может, сильно необъективно смотрю, у меня проф предпосылки: как техподдержке трейсера исключений - часто приходится отлаживать за клиента. Просто иногда действительно прямо уе**ть хочется тому, кто FreeAndNil не поставил

Почему же необъективно? Наоборот. Помнится, единственным минусом FreeAndNil называли её потенциальную опасность при вызове с левыми аргументами. Вот и скажите, кого Вам больше хочется воспитать: "тех, кто не поставил FreeAndNil и создал проблему" или "тех, кто поставил FreeAndNil и создал проблему".
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955559
Фотография Sergey1979
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему бы в Destroy или Free не вставить об'nil'ение объекта?
Я понимаю, что это как будто отпилили сук, на котором сидели... но "магия компилятора" и всё такое...
Ведь если уничтожить объект не занилив его - можно тоже получить потом в лоб.
Я про то, чтобы при компелиции это было так по умолчанию.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955560
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey1979
А почему бы в Destroy или Free не вставить об'nil'ение объекта?
Я понимаю, что это как будто отпилили сук, на котором сидели... но "магия компилятора" и всё такое...

Вставьте. Возьмите тот же Free Pascal с открытыми исходниками и добавьте в него такую функциональность. И когда она заработает, причём во всех режимах, включая, например,

Код: pascal
1.
2.
3.
begin
  TObject(nil).Free;
end;



задайтесь вопросом: а нафига было так делать то, что куда лучше и без всякой магии решается одной за две минуты написанной процедурой?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955561
Фотография Sergey1979
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но ведь Free проверяет объект на nil.
Если я ничего не путаю.
Да, с запретом - я немного не так выразил свою мысль.
Хорошо. Я Вас понял и вопросов больше нет.
Написать где нужно FreeAndNil не проблема...
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955563
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey1979,

запретите.

Сугубо ради любопытства и пополнения статистики хотелось бы спросить - какое у Вас образование?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955570
Фотография Sergey1979
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И всё-таки Вы написали глупость - СЕЙЧАС, по ряду причин, уже НЕЛЬЗЯ менять поведение по-умолчанию.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955580
softwarer
Помнится, единственным минусом FreeAndNil называли её потенциальную опасность при вызове с левыми аргументами.


Код: 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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
function GetObjectClass(APointer: Pointer): TClass;
{$IFDEF MSWINDOWS}
var
  LMemInfo: TMemoryBasicInformation;

  { Checks whether the given address is a valid address for a VMT entry. }
  function IsValidVMTAddress(APAddress: Pointer): Boolean;
  begin
    { Do some basic pointer checks: Must be dword aligned and beyond 64K }
    if (UIntPtr(APAddress) > 65535) and (UIntPtr(APAddress) and 3 = 0) then
    begin
      { Do we need to recheck the virtual memory? }
      if (UIntPtr(LMemInfo.BaseAddress) > UIntPtr(APAddress)) or ((UIntPtr(LMemInfo.BaseAddress) + NativeUInt(LMemInfo.RegionSize)) < (UIntPtr(APAddress) + SizeOf(Pointer))) then
      begin
        { Get the VM status for the pointer }
        LMemInfo.RegionSize := 0;
        VirtualQuery(APAddress, LMemInfo, SizeOf(LMemInfo));
      end;
      { Check the readability of the memory address }
      Result := (NativeUInt(LMemInfo.RegionSize) >= SizeOf(Pointer)) and (LMemInfo.State = MEM_COMMIT) and
        (LMemInfo.Protect and (PAGE_READONLY or PAGE_READWRITE or PAGE_EXECUTE or PAGE_EXECUTE_READ or PAGE_EXECUTE_READWRITE or PAGE_EXECUTE_WRITECOPY) <> 0) and (LMemInfo.Protect and PAGE_GUARD = 0);
    end
    else
      Result := False;
  end;

{ Returns true if AClassPointer points to a class VMT }
  function InternalIsValidClass(AClassPointer: Pointer; ADepth: Integer = 0): Boolean;
  var
    LParentClassSelfPointer: PPointer;
  begin
    { Check that the self pointer as well as parent class self pointer addresses
      are valid }
    if (ADepth < 1000) and IsValidVMTAddress(Pointer(PByte(AClassPointer) + vmtSelfPtr)) and IsValidVMTAddress(Pointer(PByte(AClassPointer) + vmtParent)) then
    begin
      { Get a pointer to the parent class' self pointer }
      LParentClassSelfPointer := PPointer(PByte(AClassPointer) + vmtParent)^;
      { Check that the self pointer as well as the parent class is valid }
      Result := (PPointer(PByte(AClassPointer) + vmtSelfPtr)^ = AClassPointer) and
        ((LParentClassSelfPointer = nil) or (IsValidVMTAddress(LParentClassSelfPointer) and InternalIsValidClass(LParentClassSelfPointer^, ADepth + 1)));
    end
    else
      Result := False;
  end;

begin
  { Get the class pointer from the (suspected) object }
  Result := TClass(PNativeUInt(APointer)^);
  { No VM info yet }
  LMemInfo.RegionSize := 0;
  { Check the block }
  if not InternalIsValidClass(Pointer(Result), 0) then
    Result := nil;
{$ELSE !MSWINDOWS}
begin
  { Not currently supported under Linux / OS X }
  Result := nil;
{$ENDIF MSWINDOWS}
end;

procedure FreeAndNil(var Obj); inline;
var
  Temp: TObject;
begin
  if GetObjectClass(Pointer(Obj)) <> nil then
  begin
    Temp := TObject(Obj);
    Pointer(Obj) := nil;
    Temp.Free;
  end;
end;



И никакой опасности что, кто - то попытается int\string\... Освободить
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955581
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный, в этом коде на каждое освобождение объекта - минимум один вызов в ядро, а то и больше. Вызов ядра - это очень медленно. Такой код просто так применять нельзя. Гораздо лучше - как в начале топика.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955596
GunSmoker,

Мы же не собираемся 1000 раз вызывать в секунду. Нормально! И безопасно!
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955597
GunSmoker,

Кстати, было бы не плохо, что бы хранились созданные объекты в каком нибудь списке. Что бы имелась возможность просмотреть и проверить на данный момент, валидные адреса
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955599
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой список рискует стать очень узким местом
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955601
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Нормально! И безопасно!

Хрень. Проверка должна быть на этапе компиляции. Этот код ничем не поможет, если он не вызовется. Например - где нибудь в редкой except части. Точно так-же гикнется в продакшене, что мы имеем и без этих хлопот.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955615
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
GunSmoker,
Кстати, было бы не плохо, что бы хранились созданные объекты в каком нибудь списке. Что бы имелась возможность просмотреть и проверить на данный момент, валидные адреса

Вот многопоточные приложения-то охренеют...
И, кстати, FastMM вроде память выделяет блоками и у них есть данные блока в начале (как у дин. массивов), можно покопаться если делать нечего.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955622
alekcvp,

Есть же threadvar и к тому же, если не использовать TList а обычный Arr[Pointer mod SizeArr] с пометкой ключа в true\false то это не так уж и медленно.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955648
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что только на свечку не натянут ...
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955737
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

что бы получить vmt нужно прочитать то на что ссылается "указатель", т.е. прочитать непонятно что
И скрытие проблемы это гораздо хуже, нужно сразу ексепшн давать
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955741
kealon(Ruslan),

Причём тут VMT ? Он не нужен. При create записывается индекс в массив о том, что такой адрес создан. И при destructor обнуляется.


В PHP такие индексные массивы только в путь и используются.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39955747
А мне вот стало интересно, а что быстрее. Массивы в PHP или массивы в Delphi.. На досуге проверю.

Разумеется с чистым общением ZendAPI без интерпретатора. Дабы знать на сколько поссосанная система в Delphi
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39956184
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
kealon(Ruslan),

Причём тут VMT ? Он не нужен. При create записывается индекс в массив о том, что такой адрес создан. И при destructor обнуляется.


В PHP такие индексные массивы только в путь и используются.

а это что?
Код: pascal
1.
2.
  { Get the class pointer from the (suspected) object }
  Result := TClass(PNativeUInt(APointer)^);



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


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