powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / free / FreeAndNill всегда так было?
29 сообщений из 29, показаны все 2 страниц
free / FreeAndNill всегда так было?
    #40034537
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всегда так было?

Код: 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
free / FreeAndNill всегда так было?
    #40034541
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox,

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

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

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

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

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

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


Конечно же, мы, разработчики - совершенные существа, и можем помнить всё!
...
Рейтинг: 0 / 0
free / FreeAndNill всегда так было?
    #40034553
CLSID_NTTP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
free / FreeAndNill всегда так было?
    #40034554
CLSID_NTTP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
deleted - протупил.

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


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

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

Ну, собственно, да. Создавать объект когда он нужен и освобождать сразу после этого -
такая же простая привычка как снимать штаны перед сраньем и надевать после. Хотя, конечно,
некоторые топикстартеры производят впечатление, что этого так и не освоили.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
free / FreeAndNill всегда так было?
    #40034643
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
free / FreeAndNill всегда так было?
    #40034647
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox
Всегда так было?

Да.

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

Неудобно спать на потолке. И исправлять баги в коде любителей Free без Nil.
...
Рейтинг: 0 / 0
free / FreeAndNill всегда так было?
    #40034649
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreeAndNil для слабаков!
...
Рейтинг: 0 / 0
free / FreeAndNill всегда так было?
    #40034662
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
free / FreeAndNill всегда так было?
    #40034677
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
free / FreeAndNill всегда так было?
    #40034678
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
free / FreeAndNill всегда так было?
    #40034680
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpЧто будет, если X.Free вызовет исключение?...

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

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

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

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

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

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

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

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


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

Разработчику достаточно быть грамотным инженером, чтобы всё контролировать. Быть суперсовершенным не обязательно.
Если проект очень большой, то нужен ещё и архитектор проекта, чтобы раздавать конкретные задачи, конкретным разработчикам с конкретными заданиями.
Ну и да. Формы я упомянул чисто от балды. Имел я в виду любые объекты любых классов.
Я не понимаю зачем нужна переменная-указатель на экземпляр класса, которую нужно обязательно нилить при уничтожении этого экземпляра. И зачем вообще нужна такая переменная?
...
Рейтинг: 0 / 0
free / FreeAndNill всегда так было?
    #40034772
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
antox,

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

и почему неудобно писать freeAndNil(form1)??? поясните)


Редактор не всегда подставляет, приходится руками писать :)
...
Рейтинг: 0 / 0
free / FreeAndNill всегда так было?
    #40034773
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
northener
А я вообще не понимаю для чего нужна процедура FreeAndNil.
И когда и зачем так уж нужна функция Assigned?
Неужели разработчик проекта не может так написать код, чтобы контролировать создание и уничтожение форм?


Зачем выдумывать себе лишний геморрой?
...
Рейтинг: 0 / 0
free / FreeAndNill всегда так было?
    #40034790
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
northener
Разработчику достаточно быть грамотным инженером, чтобы всё контролировать. Быть суперсовершенным не обязательно.

Всё контролировать и есть суперсовершенство, которое никому не доступно.

ЗЫ. Что за детский сад?
...
Рейтинг: 0 / 0
free / FreeAndNill всегда так было?
    #40034818
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
northener
Разработчику достаточно быть грамотным инженером, чтобы всё контролировать. Быть суперсовершенным не обязательно.

Всё контролировать и есть суперсовершенство, которое никому не доступно.

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


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