Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / free / FreeAndNill всегда так было? / 25 сообщений из 29, страница 1 из 2
10.01.2021, 02:15
    #40034537
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
Всегда так было?

Код: pascal
1.
2.
3.
4.
form1.free;

If Assigned(form1) then //Assigned(form1) = True
 form1.free; //Как следствие AV



Код: pascal
1.
2.
3.
4.
freeAndNil(form1);

if assigned(form1) then //В этом случае Assigned(form1) = False
form1.free; //все хорошо



freeAndNil(form1) писать неудобно, есть ли что-то типа form1.freeAndNil ?
...
Рейтинг: 0 / 0
10.01.2021, 02:47
    #40034541
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
antox,

а разве form1.free должен сбрасывать form1 в nil?

и почему неудобно писать freeAndNil(form1)??? поясните)
...
Рейтинг: 0 / 0
10.01.2021, 02:49
    #40034542
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
antox,

не-а. Ты хочешь в методе (класса) изменить переменную, ссылающуюся на объект класса.
А в методе доступен лишь сам объект, а не место, откуда на него ссылаются.

Пиши как все FreeAndNil(form1), не выпендривайся.

Хотя, можно добавить поле формы, где хранится адрес этой переменной переменной, тогда деструктор её очистит. Но, например, экземпляров формы может быть больше чем один, в общем - глупость.
...
Рейтинг: 0 / 0
10.01.2021, 03:04
    #40034545
northener
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
А я вообще не понимаю для чего нужна процедура FreeAndNil.
И когда и зачем так уж нужна функция Assigned?
Неужели разработчик проекта не может так написать код, чтобы контролировать создание и уничтожение форм?
...
Рейтинг: 0 / 0
10.01.2021, 04:57
    #40034546
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
northener
А я вообще не понимаю для чего нужна процедура FreeAndNil.
Экономия одной строчки для ленивых.

X.Free;
X:=nil;
...
Рейтинг: 0 / 0
10.01.2021, 04:58
    #40034547
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
northener
А я вообще не понимаю для чего нужна процедура FreeAndNil.
И когда и зачем так уж нужна функция Assigned?
Неужели разработчик проекта не может так написать код, чтобы контролировать создание и уничтожение форм?


Конечно же, мы, разработчики - совершенные существа, и можем помнить всё!
...
Рейтинг: 0 / 0
10.01.2021, 09:59
    #40034553
CLSID_NTTP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
rgreat
northener
А я вообще не понимаю для чего нужна процедура FreeAndNil.
Экономия одной строчки для ленивых.

X.Free;
X:=nil;

Не совсем. Это экономия следующей конструкции:

Код: pascal
1.
2.
3.
4.
5.
6.
var
  tmp: TObject;
...
  tmp := X;
  X := nil;
  tmp.Free;


Это не совсем одно и то же. Несмотря на то, что X := nil формально не атомарная операция, указатель-таки, если выровнен, на x86 будет установлен атомарно. В итоге мы сначала объявляем "внешнему миру", что объект not assigned, и только потом его убиваем.
...
Рейтинг: 0 / 0
10.01.2021, 10:02
    #40034554
CLSID_NTTP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
deleted - протупил.

northener
А я вообще не понимаю для чего нужна процедура FreeAndNil.
И когда и зачем так уж нужна функция Assigned?
Неужели разработчик проекта не может так написать код, чтобы контролировать создание и уничтожение форм?


Да при чем тут формы... Механизм-то универсальный. Это нужно для однородности обработки объектов, втч чтобы просто не реагировать на неинициализированные сущности.
Про FreeAndNil - см. выше.
...
Рейтинг: 0 / 0
10.01.2021, 14:26
    #40034636
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
northenerИ когда и зачем так уж нужна функция Assigned?

Она нужна исключительно в случаях когда конструкция "foo <> nil" интерпретируется
неоднозначно. Так же как и Addr() против @.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.01.2021, 14:32
    #40034639
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
ъъъъъКонечно же, мы, разработчики - совершенные существа, и можем помнить всё!

Ну, собственно, да. Создавать объект когда он нужен и освобождать сразу после этого -
такая же простая привычка как снимать штаны перед сраньем и надевать после. Хотя, конечно,
некоторые топикстартеры производят впечатление, что этого так и не освоили.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.01.2021, 14:44
    #40034643
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
CLSID_NTTPВ итоге мы сначала объявляем "внешнему миру", что объект not assigned, и только потом его
убиваем.

Совершенно бессмысленные прыжки в ширину:
Поток 1: tmp := X;
Поток 2: tmp := X;
Поток 1: X := nil;
Поток 2: X := nil;
Поток 1: tmp.free;
Поток 2: Ой!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.01.2021, 15:15
    #40034647
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
antox
Всегда так было?

Да.

antox
freeAndNil(form1) писать неудобно

Неудобно спать на потолке. И исправлять баги в коде любителей Free без Nil.
...
Рейтинг: 0 / 0
10.01.2021, 15:19
    #40034649
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
FreeAndNil для слабаков!
...
Рейтинг: 0 / 0
10.01.2021, 15:45
    #40034662
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
Dimitry Sibiryakov
Совершенно бессмысленные прыжки в ширину:
Поток 1: tmp := X;
Поток 2: tmp := X;
Поток 1: X := nil;
Поток 2: X := nil;
Поток 1: tmp.free;
Поток 2: Ой!
Логично. Ибо должно быть так

Поток 1: Lock;
Поток 2: Lock;
Поток 1: tmp := X;
Поток 1: X := nil;
Поток 1: tmp.free;
Поток 1: UnLock;
Поток 2: tmp := X;
Поток 2: X := nil;
Поток 2: Nothing;
Поток 2: UnLock;
...
Рейтинг: 0 / 0
10.01.2021, 16:31
    #40034677
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
rgreat
northener
А я вообще не понимаю для чего нужна процедура FreeAndNil.
Экономия одной строчки для ленивых.

X.Free;
X:=nil;

Что будет, если X.Free вызовет исключение?...

Dimitry Sibiryakov

Совершенно бессмысленные прыжки в ширину:
Поток 1: tmp := X;
Поток 2: tmp := X;
Поток 1: X := nil;
Поток 2: X := nil;
Поток 1: tmp.free;
Поток 2: Ой!

Если кто-то не умеет в синхронизацию - это не проблема FreeAndNil(), её задача в другом, она скорее заменяет конструкцию:
Код: pascal
1.
2.
3.
4.
5.
try
  Obj.Free;
finally
  Obj := nil;
end;

Только без накладок на секцию try-finally.
...
Рейтинг: 0 / 0
10.01.2021, 16:35
    #40034678
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
Dimitry Sibiryakov

northenerИ когда и зачем так уж нужна функция Assigned?

Она нужна исключительно в случаях когда конструкция "foo <> nil" интерпретируется
неоднозначно. Так же как и Addr() против @.

В основном Assigned() нужна для проверки обработчиков событий.
Код: pascal
1.
2.
3.
4.
5.
FOnClose: TNotifyEvent;
...
if FOnClose <> nil then ...  // вот так не получится
if @FOnClose <> nil then ...  // неоднозначно - мы проверяем адрес переменной FOnClose или что?..
if Assigned(FOnClose) then ... // вот так получится
...
Рейтинг: 0 / 0
10.01.2021, 16:39
    #40034680
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
alekcvpЧто будет, если X.Free вызовет исключение?...

Ссылка на так и не разрушившийся объект будет потеряна навсегда.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.01.2021, 16:46
    #40034683
CLSID_NTTP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
Dimitry Sibiryakov,

Пффф так никто и не говорит, что это достаточное и универсальное средство синхронизации для многопоточности. Но кое-где применимо.

Создавать объект когда он нужен и освобождать сразу после этого -
такая же простая привычка как снимать штаны перед сраньем и надевать после
А потом попадаешь в ситуацию, где объект создается одной сущностью (потоком, в частности), а уничтожается совсем в другом месте другой, причем иначе сделать невозможно из-за структуры библитоеки - и привычка уже не поможет.
...
Рейтинг: 0 / 0
10.01.2021, 17:15
    #40034689
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
Kazantsev Alexey
FreeAndNil для слабаков!
Free тоже, только Destroy!!
...
Рейтинг: 0 / 0
10.01.2021, 17:17
    #40034690
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
YuRock
Free тоже, только Destroy!!
Тут ты как раз не прав. Free защищает от исключений в вызывающем конструкторе
...
Рейтинг: 0 / 0
10.01.2021, 17:30
    #40034692
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
_Vasilisk_
YuRock
Free тоже, только Destroy!!
Тут ты как раз не прав. Free защищает от исключений в вызывающем конструкторе

Да шучу я. А в деструкторе никто не запрещает if FFieldObject <> nil then FFieldObject.Destroy писать))
...
Рейтинг: 0 / 0
10.01.2021, 17:41
    #40034695
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
CLSID_NTTPА потом попадаешь в ситуацию, где объект создается одной сущностью (потоком, в частности),
а уничтожается совсем в другом месте другой

И это как-то в Вашем мозгу отличается от первого случая?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.01.2021, 22:53
    #40034741
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
Dimitry Sibiryakov

alekcvpЧто будет, если X.Free вызовет исключение?...

Ссылка на так и не разрушившийся объект будет потеряна навсегда.

Ага, а в X останется ссылка на частично уничтоженный объект, и что будет при следующем обращении к нему - хз.
...
Рейтинг: 0 / 0
10.01.2021, 23:53
    #40034746
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
опять набежало любителей сохранять зомби-ссылки
юзайте FreeAndNil. если инстанс уничтожен, то не существует ни одной причины хранить ссылку на уничтоженное место.
практическая польза же есть: лучше ваша программа завалится у себя и на тестах, чем у юзеров.
так же привет всем идеальным программистам, пишущим идеальные программы без единой ошибки
...
Рейтинг: 0 / 0
11.01.2021, 03:07
    #40034764
northener
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
free / FreeAndNill всегда так было?
ъъъъъ
northener
А я вообще не понимаю для чего нужна процедура FreeAndNil.
И когда и зачем так уж нужна функция Assigned?
Неужели разработчик проекта не может так написать код, чтобы контролировать создание и уничтожение форм?


Конечно же, мы, разработчики - совершенные существа, и можем помнить всё!

Разработчику достаточно быть грамотным инженером, чтобы всё контролировать. Быть суперсовершенным не обязательно.
Если проект очень большой, то нужен ещё и архитектор проекта, чтобы раздавать конкретные задачи, конкретным разработчикам с конкретными заданиями.
Ну и да. Формы я упомянул чисто от балды. Имел я в виду любые объекты любых классов.
Я не понимаю зачем нужна переменная-указатель на экземпляр класса, которую нужно обязательно нилить при уничтожении этого экземпляра. И зачем вообще нужна такая переменная?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / free / FreeAndNill всегда так было? / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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