FreeAndNil и FreeThenNil

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

FreeAndNil и FreeThenNil

Сообщение Padre_Mortius » 31.01.2010 00:44:03

Кто-нибудь может рассказать зачем используются практически равнозначные указанные функции?
FreeAndNil объявлена в fpc, а FreeThenNil объявлена в LCL Lazarus.
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: FreeAndNil и FreeThenNil

Сообщение Sergei I. Gorelkin » 31.01.2010 01:30:03

Ну какие же они равнозначные... FreeAndNil обнуляет ссылку до вызова деструктора, так что если деструктор рухнет, будет однозначная утечка памяти, даже если исключение поймать. А FreeThenNil обнуляет ссылку после, поэтому исключение в деструкторе можно умело поймать и попробовать еще раз :)

Многие вещи в LCL писались по причине нехватки аналогов в FPC. Когда эти аналоги потом в FPC появлялись, в LCL они подчищались отнюдь не сразу...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: FreeAndNil и FreeThenNil

Сообщение Padre_Mortius » 31.01.2010 01:58:34

Если я правильно понимаю, то использовать FreeThenNil более грамотно, но по какой причине в fpc используется вариант FreeAndNil?
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: FreeAndNil и FreeThenNil

Сообщение Sergei I. Gorelkin » 31.01.2010 03:24:05

По той причине, что в Дельфи так сделано.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: FreeAndNil и FreeThenNil

Сообщение Bupyc » 31.01.2010 13:04:45

Я тоже как то налетел на особенность функции FreeAndNil. Она действительно сначала обнуляет ссылку, а потом делает Free. На мой взгляд, разработчикам RTL в дельфях было бы правльнее назвать её NilAndFree.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Re: FreeAndNil и FreeThenNil

Сообщение alexrayne » 01.02.2010 01:22:56

а каким образом пострадает совместимость с дельфой если сделать как предложено в лазаре? ведь предъяв по несовместимости в етом плане небыло наверно? а если несовместимость и проявится то ето будет в обработке исключений, а ето уже само по себе исключительное дело.
или тренд фрюхи - совместимость влоть до одинаковых багов?
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: FreeAndNil и FreeThenNil

Сообщение Sergei I. Gorelkin » 01.02.2010 02:21:42

Я вообще-то в первом посте этой темы просто стебался :)

Задачей FreeAndNil является разрыв возможных кольцевых ссылок в сложных иерархиях объектов и предотвращение повторных вызовов деструктора одного и того же объекта. Чтобы, если не наследуешься от TComponent, не приходилось городить механизм, аналогичный "csDestroying in ComponentState" и TComponent.Notification.
FreeThenNil ничего подобного не делает, и весь ее смысл - в экономии одной строки кода.
Предъяв по совместимости не было как раз из-за наличия этой самой совместимости.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], MailRu[bot] и гости: 49

Рейтинг@Mail.ru