
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.218] |
![]() |
|
Страницы: (245) « Первая ... 218 219 [220] 221 222 ... 244 245 ( Перейти к последнему сообщению ) |
Сообщ.
#3286
,
|
|
|
А где вызываются методы уничтоженного объекта? И в какой момент объект уничтожен? |
Сообщ.
#3287
,
|
|
|
Цитата --Ins-- @ А где вызываются методы уничтоженного объекта? В контексте C++ так было бы, если бы работал полиморфизм в деструкторах. Цитата --Ins-- @ И в какой момент объект уничтожен? Когда отработал его деструктор. |
Сообщ.
#3288
,
|
|
|
Цитата OpenGL @ Создание и удаление объекта - дело исключительно этого объекта, а не потомков объекта этого класса. Ага, интимное ![]() ![]() Добавлено Цитата MyNameIsIgor @ Когда отработал его деструктор. А, ну, когда отработал деструктор никакие методы этого объекта и не вызываются. Проблемы с FreeAndNil как раз из-за того возможны, что деструктор еще не отработал, а ссылка уже занулена |
Сообщ.
#3289
,
|
|
|
Цитата --Ins-- @ А где вызываются методы уничтоженного объекта? В деструкторе наследника, не? У вас же там: Цитата В Дельфи полиморфизм на уровне конструирования и уничтожения - нормальная практика Цитата --Ins-- @ И в какой момент объект уничтожен? Так после отработки деструктора - объект уничтожен. А как в делфи при наличии полиморфизма? После вызова дестркутора объект еще живой, ага ? |
Сообщ.
#3290
,
|
|
|
Цитата Wound @ А как в делфи при наличии полиморфизма? После вызова дестркутора объект еще живой, ага ? Агонизирует ![]() ![]() Добавлено Цитата --Ins-- @ Проблемы с FreeAndNil как раз из-за того возможны, что деструктор еще не отработал Так нет же - деструктор потомка уже отработал. |
![]() |
Сообщ.
#3291
,
|
|
Цитата --Ins-- @ Полиморфное конструирование удобно и совершенно безопасно при правильном использовании. Я верю в это ![]() Цитата --Ins-- @ Но мне не интересно спорить на эту тему по десятому разу Печально ![]() |
Сообщ.
#3292
,
|
|
|
Цитата --Ins-- @ Проблемы с FreeAndNil как раз из-за того возможны, что деструктор еще не отработал, а ссылка уже занулена Ага, так его судя по всему и предлагают пихать бездумно и везде, именно затем что деструктор еще не отработал, а объект уже удален и не занулен ![]() |
Сообщ.
#3293
,
|
|
|
Цитата OpenGL @ Печально В предыдущих итерациях я не участвовал. Ну, давайте, теперь ваша очередь - а мы посмотрим ![]() |
Сообщ.
#3294
,
|
|
|
Цитата Wound @ После вызова дестркутора объект еще живой, ага ? Нужно понимать что такое в дельфи вызов деструктора, равно как и вызов конструктора. Деструктор и конструктор - не обычные методы, когда пишешь их вызов - работает магия компилятора, это не равносильно вызову обычного метода. Для клиентского кода Create и Destroy именно работают как конструктор и деструктор - выделяют/освобождают память, проводят инициализацию VMT и т.д, притом что их фактическое тело может быть пустым. Но когда мы к примеру пишем inherited Destroy в деструкторе потомка этот вызов никакую память под объект предка не освободит - это просто вызов кода деинициализации. На момент после этого вызова объект не уничтожен и destroy просто фактически обычный метод. Объект будет существовать до тех пор, пока вся цепочка не отработает. Так что утверждение, что на момент выполнения Destroy потомка предок уничтожен - неверно Добавлено Цитата OpenGL @ Я скорей не вижу в нем необходимости. А необходимости нет, впрочем как и вообще в полиморфизме ![]() Добавлено Цитата Wound @ Ага, так его судя по всему и предлагают пихать бездумно и везде Я вообще не понимаю мотивацию тех, кто предлагает его бездумно пихать везде. Если че, Борландовцы, когда придумывали дельфи, не предлагали, да и сейчас официально никто не предлагает. Есть чье-то сугубо личное спорное мнение на этот счет, не более того. Free предлагают писать вместо Destroy бездумно везде, но это то как раз понятно |
![]() |
Сообщ.
#3295
,
|
|
Цитата --Ins-- @ Если че, Борландовцы, когда придумывали дельфи, не предлагали, да и сейчас официально никто не предлагают. Зачем оно тогда вообще есть в стандартной библиотеке? |
Сообщ.
#3296
,
|
|
|
Цитата --Ins-- @ На момент после этого вызова объект не уничтожен и destroy просто фактически обычный метод. Объект будет существовать до тех пор, пока вся цепочка не отработает. Так что утверждение, что на момент выполнения Destroy потомка предок уничтожен - неверно Формально - да. Т. е. объект "физически" ещё существует. Но вот существует ли он логически? Ведь с точки зрения логики весь код деинициализации уже выполнен. То, что память ещё не освобождена - это лишь формальность. А коли деинициализация уже произошла, то пользоваться таким объектом (с точки зрения логики) - смерти подобно. Точнее, эммм..., очень рискованно. Нет? И именно наличие такого функционала приводит к тому, что разработчиком приходится придумывать мозговыносящие инварианты, следить за их соблюдением, дёргать FreeAndNil, надеяться на то, что разработчики используемых компонент - в достаточной степени пряморукие. Вот оно вот так надо? |
Сообщ.
#3297
,
|
|
|
Цитата --Ins-- @ Так что утверждение, что на момент выполнения Destroy потомка предок уничтожен - неверно А какой толк от этого потомка предка? Он же уже деинициализирован, отсюда могут быть скрытые ошибки, не зря же вы там в деструкторе на Nil проверяете все. Вот какой смысл мешать порядок вызова деинициализаторов? |
Сообщ.
#3298
,
|
|
|
Цитата korvin @ Зачем оно тогда вообще есть в стандартной библиотеке? Хз. Наверное в самом деле как ремень безопасности для тех, у кого руки растут не из того места. Я им никогда не пользуюсь Добавлено Цитата Flex Ferrum @ И именно наличие такого функционала приводит к тому, что разработчиком приходится придумывать мозговыносящие инварианты, следить за их соблюдением, дёргать FreeAndNil, надеяться на то, что разработчики используемых компонент - в достаточной степени пряморукие. Вот оно вот так надо? Не приходится ![]() ![]() |
![]() |
Сообщ.
#3299
,
|
|
Цитата --Ins-- @ Так что утверждение, что на момент выполнения Destroy потомка предок уничтожен - неверно Так в плюсах примерно так же - при выполнении деструктора потомка деструктор предка еще не был вызван, а значит, что и к предку можно нормально обращаться ![]() |
![]() |
Сообщ.
#3300
,
|
|
Цитата --Ins-- @ Хз. Наверное в самом деле как ремень безопасности для тех, у кого руки растут не из того места. Я им никогда не пользуюсь Э-э... А в чем безопасность? Разве после вызова деструктора объект не должен и так становиться nil? |