Кто-нибудь может рассказать зачем используются практически равнозначные указанные функции?
FreeAndNil объявлена в fpc, а FreeThenNil объявлена в LCL Lazarus.
FreeAndNil и FreeThenNil
Модератор: Модераторы
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Ну какие же они равнозначные... FreeAndNil обнуляет ссылку до вызова деструктора, так что если деструктор рухнет, будет однозначная утечка памяти, даже если исключение поймать. А FreeThenNil обнуляет ссылку после, поэтому исключение в деструкторе можно умело поймать и попробовать еще раз 
Многие вещи в LCL писались по причине нехватки аналогов в FPC. Когда эти аналоги потом в FPC появлялись, в LCL они подчищались отнюдь не сразу...
Многие вещи в LCL писались по причине нехватки аналогов в FPC. Когда эти аналоги потом в FPC появлялись, в LCL они подчищались отнюдь не сразу...
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
Если я правильно понимаю, то использовать FreeThenNil более грамотно, но по какой причине в fpc используется вариант FreeAndNil?
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
По той причине, что в Дельфи так сделано.
Я тоже как то налетел на особенность функции FreeAndNil. Она действительно сначала обнуляет ссылку, а потом делает Free. На мой взгляд, разработчикам RTL в дельфях было бы правльнее назвать её NilAndFree.
а каким образом пострадает совместимость с дельфой если сделать как предложено в лазаре? ведь предъяв по несовместимости в етом плане небыло наверно? а если несовместимость и проявится то ето будет в обработке исключений, а ето уже само по себе исключительное дело.
или тренд фрюхи - совместимость влоть до одинаковых багов?
или тренд фрюхи - совместимость влоть до одинаковых багов?
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Я вообще-то в первом посте этой темы просто стебался 
Задачей FreeAndNil является разрыв возможных кольцевых ссылок в сложных иерархиях объектов и предотвращение повторных вызовов деструктора одного и того же объекта. Чтобы, если не наследуешься от TComponent, не приходилось городить механизм, аналогичный "csDestroying in ComponentState" и TComponent.Notification.
FreeThenNil ничего подобного не делает, и весь ее смысл - в экономии одной строки кода.
Предъяв по совместимости не было как раз из-за наличия этой самой совместимости.
Задачей FreeAndNil является разрыв возможных кольцевых ссылок в сложных иерархиях объектов и предотвращение повторных вызовов деструктора одного и того же объекта. Чтобы, если не наследуешься от TComponent, не приходилось городить механизм, аналогичный "csDestroying in ComponentState" и TComponent.Notification.
FreeThenNil ничего подобного не делает, и весь ее смысл - в экономии одной строки кода.
Предъяв по совместимости не было как раз из-за наличия этой самой совместимости.
