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


    На nil в деструкторе проверяется все (причем неявно как правило, т.к. внутри Free эта проверка заложена уже) из-за возможности исключения в конструкторе. Если в дельфи при вызове конструктора происходит исключение, то вызывается деструктор, чтобы освободить все то, что успело создаться в конструкторе до исключения - сборщика мусора то нет. Так вот, если на момент исключения в конструкторе что-то еще не создалось, то только в этом случае нужна проверка на nil. Поэтому Free вместо Destroy и пишут, т.к. Free это if Self <> nil then Destroy. С другим, где бы это было нужно, я на практике не встречался.

    Добавлено
    Цитата korvin @
    Разве после вызова деструктора объект не должен и так становиться nil?


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

      Ох, фак :facepalm:
        Цитата --Ins-- @
        Если в дельфи при вызове конструктора происходит исключение, то вызывается деструктор, чтобы освободить все то, что успело создаться в конструкторе до исключения - сборщика мусора то нет. Так вот, если на момент исключения в конструкторе что-то еще не создалось, то только в этом случае нужна проверка на nil.

        После плюсов это кажется дикостью :)
          Цитата --Ins-- @
          На nil в деструкторе проверяется все (причем неявно как правило, т.к. внутри Free эта проверка заложена уже) из-за возможности исключения в конструкторе.

          Зачем тогда FreeAndNil ? Мне не понятно зачем занулять указатель на объект перед вызовом деструктора? Почему не Free и потом зануление? Видимо всетаки возможны ситуации , и они не так уж и редки, когда в деструкторе имеем уничтоженый, но не зануленный объект?
            Цитата korvin @
            Разве после вызова деструктора объект не должен и так становиться nil?


            Даже если бы и существовала возможность устанавливать все ссылки в nil автоматически послу уничтожение объекта - все равно это было бы говно. Я не сторонник проверять, уничтожен ли объект или нет по проверке ссылки на nil, я предпочитаю чтобы при уничтожении объекта все заинтересованные получали об этом уведомления и сами предпринимали нужные действия, которые обнулением ссылки могут не ограничиваться
              Вот например оригинал статьи про FreeAndNil. Так вот там автор утверждает что Free оцтой и ведет к скрытым ошибкам и приводит в пример к каким.
              Цитата

              http://www.gunsmoker.ru/2009/04/freeandnil-free.html

              Многие говорят, что опытный программист может ставить FreeAndNil только там, где это необходимо. Если грамотно использовать объекты (например, уничтожать объекты исключительно в деструкторе), то не будет нужды в FreeAndNil.

              Но это не верно. Вы не можете этого знать.

              Представим, что в деструкторе объекта (объект-контейнер) мы удаляем объектное поле с помощью Free. В деструкторе этого поля вызывается виртуальный метод, который ничего не делает в базовом классе, а в каком-то далёком предке вызывает последовательность действий, которая приводит к вызову виртуального-же метода объекта-контейнера. Который, в свою очередь, в каком-нибудь далёком предке (ошибочно) обращается к нашему удаляемому полю. При этом, обращение проходит на ура, но общее состояние становится безвозвратно испорченным. Упс.
                Цитата --Ins-- @
                Ты понимаешь разницу между объектом и ссылкой на объект? Объект не может становиться nil, он может только уничтожиться. А ссылка может стать равной nil. А ссылок может быть несколько на один и тот же объект и волшебным образом их никто при уничтожении не обнулит, т.к. рантайм нигде не хранит все ссылки на объекты.

                Действительно. FreeAndNil их тоже волшебным образом не обнулит:
                ExpandedWrap disabled
                  type
                    TFoo = class
                    public
                      Value: Integer;
                    end;
                   
                  var a, b: TFoo;
                   
                  procedure CheckNil(v: TObject);
                  begin
                    if v = nil then WriteLn('True') else WriteLn('False');
                  end;
                   
                  begin
                    a := TFoo.Create;
                    b := a;
                    FreeAndNil(a);
                    CheckNil(a);
                    CheckNil(b);
                    b.Value := 2;
                    WriteLn(b.Value);
                   
                    ReadLn;
                  end.

                ExpandedWrap disabled
                  True
                  False
                  2


                Деструкторы такие деструкторы.
                  Цитата Flex Ferrum @
                  Формально - да. Т. е. объект "физически" ещё существует. Но вот существует ли он логически?
                  У него руки-ноги уже отрублены, но сердце еще стучит... А еще столько дел сделать надо. Например, завещание написать.
                  Сообщение отредактировано: trainer -
                    Цитата Wound @
                    Зачем тогда FreeAndNil ?


                    Спроси у адептов FreeAndNil, я то тут причем :D Я не пишу код так, чтобы FreeAndNil был необходим, может кто-то пишет и он тебе пояснит... Если конечно этот кто-то пишет его обоснованно, а не потому что ему его рекомендовали в обязательном порядке
                      Цитата
                      В деструкторе этого поля вызывается виртуальный метод, который ничего не делает в базовом классе, а в каком-то далёком предке вызывает последовательность действий, которая приводит к вызову виртуального-же метода объекта-контейнера.

                      Полиморфизм в конструкторах/деструкторах во всей своей извращённой красоте...
                        Цитата --Ins-- @
                        Спроси у адептов FreeAndNil, я то тут причем :D Я не пишу код так, чтобы FreeAndNil был необходим, может кто-то пишет и он тебе пояснит...

                        Адепты FreeAndNil говорят что ты не можешь не написать код так, чтобы FreeAndNil не был необходим. Вернее ты не можешь быть уверен что ты написал хороший код, если не использовал FreeAndNil. И там же по ссылке он приводит аргументацию.
                          Цитата korvin @
                          FreeAndNil их тоже волшебным образом не обнулит:


                          Совершенно верно, он обнулит только ту ссылку, что ему туда запихнут. От этого практической пользы еще меньше. nil вообще не должен быть индикатором, что объект уничтожен.
                            Цитата --Ins-- @
                            Совершенно верно, он обнулит только ту ссылку, что ему туда запихнут.

                            Погоди, в примере korvin, переменные a и b указывают на разные места? :huh: он же присвоил b := a. Почему результат разный? Для 'а' ссылка обнулилась, а для 'b' почему False ? :ph34r:
                              Цитата Wound @
                              Вернее ты не можешь быть уверен что ты написал хороший код, если не использовал FreeAndNil. И там же по ссылке он приводит аргументацию.


                              Могу :D Адепты врут. Я для нотификации об уничтожении объекта использую нотификацию в виде вызовов методов заинтересованных объектов, а не обнуление внешней ссылки :D

                              Добавлено
                              Цитата Wound @
                              переменные a и b указывают на разные места?


                              Нет

                              Цитата Wound @
                              Почему результат разный?


                              a := 5;
                              b := 5;
                              a := 0;
                              Чему равно b? Почему оно тоже должно стать 0? Оно так и останется 5
                                Цитата --Ins-- @
                                nil вообще не должен быть индикатором, что объект уничтожен.
                                Тогда зачем проверки на nil в конструкторах/деструкторах, если это не индикатор? А что является или должно являться индикатором?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (245) « Первая ... 219 220 [221] 222 223 ...  244 245


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