На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (245) « Первая ... 218 219 [220] 221 222 ...  244 245  ( Перейти к последнему сообщению )  
> Есть ли будущее у DELPHI?
    Цитата MyNameIsIgor @
    как вообще можно вызвать метод уже уничтоженного объекта?


    А где вызываются методы уничтоженного объекта? И в какой момент объект уничтожен?
      Цитата --Ins-- @
      А где вызываются методы уничтоженного объекта?

      В контексте C++ так было бы, если бы работал полиморфизм в деструкторах.
      Цитата --Ins-- @
      И в какой момент объект уничтожен?

      Когда отработал его деструктор.
        Цитата OpenGL @
        Создание и удаление объекта - дело исключительно этого объекта, а не потомков объекта этого класса.


        Ага, интимное :D Полиморфное конструирование удобно и совершенно безопасно при правильном использовании. Но мне не интересно спорить на эту тему по десятому разу :D Давайте лучше про FreeAndNil если кому-то есть что добавить

        Добавлено
        Цитата MyNameIsIgor @
        Когда отработал его деструктор.


        А, ну, когда отработал деструктор никакие методы этого объекта и не вызываются. Проблемы с FreeAndNil как раз из-за того возможны, что деструктор еще не отработал, а ссылка уже занулена
        Сообщение отредактировано: --Ins-- -
          Цитата --Ins-- @
          А где вызываются методы уничтоженного объекта?

          В деструкторе наследника, не? У вас же там:
          Цитата
          В Дельфи полиморфизм на уровне конструирования и уничтожения - нормальная практика


          Цитата --Ins-- @
          И в какой момент объект уничтожен?

          Так после отработки деструктора - объект уничтожен. А как в делфи при наличии полиморфизма? После вызова дестркутора объект еще живой, ага ?
            Цитата Wound @
            А как в делфи при наличии полиморфизма? После вызова дестркутора объект еще живой, ага ?

            Агонизирует :) FreeAndNil его добивает :D

            Добавлено
            Цитата --Ins-- @
            Проблемы с FreeAndNil как раз из-за того возможны, что деструктор еще не отработал

            Так нет же - деструктор потомка уже отработал.
              Цитата --Ins-- @
              Полиморфное конструирование удобно и совершенно безопасно при правильном использовании.

              Я верю в это :D Я скорей не вижу в нем необходимости.
              Цитата --Ins-- @
              Но мне не интересно спорить на эту тему по десятому разу

              Печально :D В предыдущих итерациях я не участвовал.
                Цитата --Ins-- @
                Проблемы с FreeAndNil как раз из-за того возможны, что деструктор еще не отработал, а ссылка уже занулена

                Ага, так его судя по всему и предлагают пихать бездумно и везде, именно затем что деструктор еще не отработал, а объект уже удален и не занулен :D Рекурсия прям...
                  Цитата OpenGL @
                  Печально В предыдущих итерациях я не участвовал.

                  Ну, давайте, теперь ваша очередь - а мы посмотрим :D
                    Цитата Wound @
                    После вызова дестркутора объект еще живой, ага ?


                    Нужно понимать что такое в дельфи вызов деструктора, равно как и вызов конструктора. Деструктор и конструктор - не обычные методы, когда пишешь их вызов - работает магия компилятора, это не равносильно вызову обычного метода. Для клиентского кода Create и Destroy именно работают как конструктор и деструктор - выделяют/освобождают память, проводят инициализацию VMT и т.д, притом что их фактическое тело может быть пустым. Но когда мы к примеру пишем inherited Destroy в деструкторе потомка этот вызов никакую память под объект предка не освободит - это просто вызов кода деинициализации. На момент после этого вызова объект не уничтожен и destroy просто фактически обычный метод. Объект будет существовать до тех пор, пока вся цепочка не отработает. Так что утверждение, что на момент выполнения Destroy потомка предок уничтожен - неверно

                    Добавлено
                    Цитата OpenGL @
                    Я скорей не вижу в нем необходимости.


                    А необходимости нет, впрочем как и вообще в полиморфизме :) Без него обойтись можно. Просто это удобная (порой) альтернатива

                    Добавлено
                    Цитата Wound @
                    Ага, так его судя по всему и предлагают пихать бездумно и везде


                    Я вообще не понимаю мотивацию тех, кто предлагает его бездумно пихать везде. Если че, Борландовцы, когда придумывали дельфи, не предлагали, да и сейчас официально никто не предлагает. Есть чье-то сугубо личное спорное мнение на этот счет, не более того. Free предлагают писать вместо Destroy бездумно везде, но это то как раз понятно
                    Сообщение отредактировано: --Ins-- -
                      Цитата --Ins-- @
                      Если че, Борландовцы, когда придумывали дельфи, не предлагали, да и сейчас официально никто не предлагают.


                      Зачем оно тогда вообще есть в стандартной библиотеке?
                        Цитата --Ins-- @
                        На момент после этого вызова объект не уничтожен и destroy просто фактически обычный метод. Объект будет существовать до тех пор, пока вся цепочка не отработает. Так что утверждение, что на момент выполнения Destroy потомка предок уничтожен - неверно

                        Формально - да. Т. е. объект "физически" ещё существует. Но вот существует ли он логически? Ведь с точки зрения логики весь код деинициализации уже выполнен. То, что память ещё не освобождена - это лишь формальность. А коли деинициализация уже произошла, то пользоваться таким объектом (с точки зрения логики) - смерти подобно. Точнее, эммм..., очень рискованно. Нет? И именно наличие такого функционала приводит к тому, что разработчиком приходится придумывать мозговыносящие инварианты, следить за их соблюдением, дёргать FreeAndNil, надеяться на то, что разработчики используемых компонент - в достаточной степени пряморукие. Вот оно вот так надо?
                          Цитата --Ins-- @
                          Так что утверждение, что на момент выполнения Destroy потомка предок уничтожен - неверно

                          А какой толк от этого потомка предка? Он же уже деинициализирован, отсюда могут быть скрытые ошибки, не зря же вы там в деструкторе на Nil проверяете все. Вот какой смысл мешать порядок вызова деинициализаторов?
                            Цитата korvin @
                            Зачем оно тогда вообще есть в стандартной библиотеке?


                            Хз. Наверное в самом деле как ремень безопасности для тех, у кого руки растут не из того места. Я им никогда не пользуюсь

                            Добавлено
                            Цитата Flex Ferrum @
                            И именно наличие такого функционала приводит к тому, что разработчиком приходится придумывать мозговыносящие инварианты, следить за их соблюдением, дёргать FreeAndNil, надеяться на то, что разработчики используемых компонент - в достаточной степени пряморукие. Вот оно вот так надо?


                            Не приходится :D Я выше писал, FreeAndNil не нужен в нормальном коде, причем полиморфизм на этапе конструирования/деконструирования вполне может присутствовать. Но FreeAndNil все равно не нужен :D Единственное что может (и да, бывает) понадобится при таком подходе - это вставлять вызов конструктора/деструктора предка в произвольное место. Дельфи технически это тоже позволяет. И эта возможность при соблюдении некоторых простых правил делает вызовы виртуальных методов из конструктора/деструктора полностью безопасным. Хотя можно с этим и напортачить да, но это вопрос исключительно прямоты рук
                              Цитата --Ins-- @
                              Так что утверждение, что на момент выполнения Destroy потомка предок уничтожен - неверно

                              Так в плюсах примерно так же - при выполнении деструктора потомка деструктор предка еще не был вызван, а значит, что и к предку можно нормально обращаться :) Мы же про другое - на момент выполнения деструктора предка деструктор потомка уже был вызван. Поэтому, даже если бы виртуальные вызовы разрешались - смысла в них не было бы никакого - это был бы вызов метода уже разрушенного объекта.
                                Цитата --Ins-- @
                                Хз. Наверное в самом деле как ремень безопасности для тех, у кого руки растут не из того места. Я им никогда не пользуюсь

                                Э-э... А в чем безопасность? Разве после вызова деструктора объект не должен и так становиться nil?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (245) « Первая ... 218 219 [220] 221 222 ...  244 245


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1957 ]   [ 15 queries used ]   [ Generated: 20.07.25, 23:18 GMT ]