Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Улучшил FreeAndNil. Можете не благодарить. / 25 сообщений из 226, страница 1 из 10
21.04.2020, 18:54
    #39949559
Maxim Rusov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улучшил FreeAndNil. Можете не благодарить.
Достало, что в 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
21.04.2020, 19:44
    #39949599
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улучшил FreeAndNil. Можете не благодарить.
Maxim Rusov
Достало, что в FreeAndNil можно по ошибке передать что угодно и компилятор это никак не проверяет.


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


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


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


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

даже если предложенная замена это хак, то выходит, что один хак заменили другим, чуток более удобным
...
Рейтинг: 0 / 0
22.04.2020, 11:58
    #39949934
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улучшил FreeAndNil. Можете не благодарить.
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
22.04.2020, 12:35
    #39949955
Maxim Rusov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улучшил FreeAndNil. Можете не благодарить.
wadman

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

Сложно работать в команде с людьми, которые даже не проверяют, что они написали
...
Рейтинг: 0 / 0
22.04.2020, 12:50
    #39949961
Улучшил FreeAndNil. Можете не благодарить.
Ну не просто так же было в оригинале написано (var Obj) скорее всего, подразумевалось что, можно вызвать не только для объекта с наследником TObject
...
Рейтинг: 0 / 0
22.04.2020, 19:49
    #39950156
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улучшил FreeAndNil. Можете не благодарить.
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
22.04.2020, 19:51
    #39950158
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Улучшил FreeAndNil. Можете не благодарить.
ВсеРазумный
подразумевалось
Не подразумевалось. С
Код: pascal
1.
var Obj: TObject

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

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

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

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

Зачем?

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

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


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

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

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

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

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

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

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

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


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