
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.218] |
![]() |
|
Страницы: (245) « Первая ... 217 218 [219] 220 221 ... 244 245 ( Перейти к последнему сообщению ) |
Сообщ.
#3271
,
|
|
|
Затем, что если остальной код написан правильно (и предварительно проверяет указатель на nil перед обращением), то в процессе сложного удаления исключений произойти не должно. Но, опять же, если по программе разбросаны указатели на удаляемый объект, или случилась гонка по памяти, или нет проверок на nil, или руки из жопы растут - то FreeAndNil, увы, не поможет... Лично по мне, так наличие такого метода провоцирует кривой дизайн классов в целом... |
Сообщ.
#3272
,
|
|
|
Цитата D_KEY @ А зачем там сначала идет nil, а потом освобождение? Не говоря уже о том, что в занулении смысла особого нет, кроме отлавливания багов. Так ведь чтоб костыли зафиксить свои. У них же потом Free вызывается, а там судя по всему |
![]() |
Сообщ.
#3273
,
|
|
Да выходит что есть - т.к. в деструкторах базовых классов может вызываться виртуальный метод, который фактически вызовется на дочернем объекте для которого деструктор уже отработал. Коротче: в Делфи, в отличие от С++, полиморфизм работает в конструторах и деструкторах. |
Сообщ.
#3274
,
|
|
|
Цитата Chow @ Коротче: в Делфи, в отличие от С++, полиморфизм работает в конструторах и деструкторах. Им нужно было убрать деструкторы и подключить GC и получилась бы Java ![]() ![]() |
Сообщ.
#3275
,
|
|
|
Цитата Flex Ferrum @ Затем, что если остальной код написан правильно (и предварительно проверяет указатель на nil перед обращением), то в процессе сложного удаления исключений произойти не должно. Если код написан правильно, то никакие FreeAndNil не нужны... Добавлено Цитата Chow @ Да выходит что есть - т.к. в деструкторах базовых классов может вызываться виртуальный метод, который фактически вызовется на дочернем объекте для которого деструктор уже отработал. Коротче: в Делфи, в отличие от С++, полиморфизм работает в конструторах и деструкторах. Конструкторы и деструкторы в Delphi мы уже обсуждали в соответствующем холиваре ![]() Добавлено Цитата Wound @ Java-прогеры любят finally ![]() У них теперь есть альтернатива. |
Сообщ.
#3276
,
|
|
|
Цитата D_KEY @ У них теперь есть альтернатива. Круто, но как то синтаксис хромает. Это теперь нужно в скобках перечислять все что должно автоматом закрыться? Так то ведь и запутатся можно имхо... |
![]() |
Сообщ.
#3277
,
|
|
Цитата D_KEY @ Если код написан правильно, то никакие FreeAndNil не нужны Что значит "правильно"? Никогда не вызывать виртуальных методов из деструкторов? |
Сообщ.
#3278
,
|
|
|
Цитата Chow @ Никогда не вызывать виртуальных методов из деструкторов? В том числе(раз возможна такая пьянка, что ты сам описал) ![]() Обсуждали уже ![]() |
Сообщ.
#3279
,
|
|
|
Цитата Chow @ Никогда не вызывать виртуальных методов из деструкторов? А зачем вызывать виртуальные методы из деструкторов? ИМХО, операция удаления должна быть прозрачной, без каких либо вызовов вирт. методов. Цитата Chow @ Что значит "правильно"? FreeAndNil смахивает на нехилый такой костыль, чтоб прикрывать ошибки своего дизайна. Поэтому если ты напишешь без ошибок, то есть правильно, тебе не понадобится FreeAndNil, ну как то так. |
Сообщ.
#3280
,
|
|
|
Цитата D_KEY @ Если код написан правильно, то никакие FreeAndNil не нужны... Полностью согласен ![]() Добавлено Цитата Wound @ А зачем вызывать виртуальные методы из деструкторов? ИМХО, операция удаления должна быть прозрачной, без каких либо вызовов вирт. методов. Кому должна? В Дельфи полиморфизм на уровне конструирования и уничтожения - нормальная практика, там нет никаких технических ограничений для этого, в отличие от с++ |
Сообщ.
#3281
,
|
|
|
Цитата --Ins-- @ Кому должна? В Дельфи полиморфизм на уровне конструирования и уничтожения - нормальная практика, там нет никаких технических ограничений для этого, в отличие от с++ То что в делфи это нормальная практика еще не означает что это нормальная практика вообще. Если в деструкторах даже в делфийских городить огород и бизнес логику, то к добру это точно не приведет. Операция уничтожения как правило освобождает захваченые ресурсы, и если эту операцию переусложнить, то ты только себе хуже делаешь. Поэтому она все таки должна быть прозрачной. |
Сообщ.
#3282
,
|
|
|
Цитата --Ins-- @ там нет никаких технических ограничений для этого, в отличие от с++ В C++ нет технических ограничений, они логические: как вообще можно вызвать метод уже уничтоженного объекта? |
Сообщ.
#3283
,
|
|
|
Нет, только не снова
![]() |
![]() |
Сообщ.
#3284
,
|
|
Цитата --Ins-- @ В Дельфи полиморфизм на уровне конструирования и уничтожения - нормальная практика Создание и удаление объекта - дело исключительно этого объекта, а не потомков объекта этого класса. |
Сообщ.
#3285
,
|
|
|
Цитата D_KEY @ Нет, только не снова ![]() Не, ну а что? ![]() ![]() |