powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Улучшил FreeAndNil. Можете не благодарить.
25 сообщений из 226, страница 1 из 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
25 сообщений из 226, страница 1 из 10
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Улучшил FreeAndNil. Можете не благодарить.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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