1. C++ / Говнокод #13820

    +8

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    if (dequeueBuffer_) {
        delete dequeueBuffer_;
        dequeueBuffer_ = NULL;
      }
    
      if (enqueueBuffer_) {
        delete enqueueBuffer_;
        enqueueBuffer_ = NULL;
      }
    
      if (readBuff_) {
        delete[] readBuff_;
        readBuff_ = NULL;
      }
    
      if (currentEvent_) {
        delete currentEvent_;
        currentEvent_ = NULL;
      }

    Apache Thrift 0.9.1, made in Facebook
    Код в деструкторе:

    Запостил: Fogbit, 19 Сентября 2013

    Комментарии (28) RSS

    • Дико извиняюсь: что здесь не так?
      Ответить
      • 1) delete нуля по стандарту ничего не делает
        2) google smart pointers
        Ответить
        • > google smart pointers
          Хм, можно ссылку на гугловскую либу со смартпоинтерами?

          В гуглокрестостайлгайде они советуют юзать обычный unique_ptr...
          Ответить
          • google - это глагол
            Ответить
            • А smart это прилагательное... google smart - гугли по-умному... Ок, пойду гуглить по-умному...
              Ответить
              • наречие
                Ну, или селбри в Лоджбане.
                Ответить
                • Даже не так, это второй гизму из пары составляющей танру, которая в свою очередь является основой селбри этого бриди.
                  Ответить
                  • Серьезно увлеклись лоджбаном? :) Кстати а как там с заимствованными словами? Пишут транслитом, или же пытаются выразить через уже существующие?
                    Ответить
                    • Это уже третья попытка, блин...

                      Для заимствованых слов есть фонетическая транскрипция, но она иногда больше напоминает японский чем что либо еще. С непривычки иногда очень сложно угадать знакомые слова.
                      Ответить
      • if (readBuff_) {
        delete[] readBuff_;
        readBuff_ = NULL;
        }

        Такие конструкции излишни. Можно сделать просто delete readBuff_, т.к. в случае не NULL память освободится, а в противном случае стандарт гарантирует корректную работу. Присваивание NULL в деструкторе имхо бессмысленно.
        Проверка на NULL говорит о том, что непонятно где указатель инициализируется, может в каком-то методе Init. А должен инициализироваться в конструкторе.

        Это конечно если не говорить об использовании smart pointer. Имхо здесь они специально не используются в угоду производительности.
        Ответить
        • > не используются в угоду производительности
          У std::auto_ptr, std::unique_ptr и boost::scoped_ptr производительность ну всяко не хуже ;)
          Ответить
          • Я бы сказал наоборот, что производительность голого указателя никак не хуже smart_ptr. Про обратное не знаю, но логика подсказывает что не обязательно. Хотя, думаю если хуже то на наносекунды.
            Ответить
            • Какая нафиг производительность, здесь же голое владение, а умные указатели без подсчёта ссылок инлайнятся полностью, от них в рантайме и следа не остаётся. Зато столько геммора с исключениями и освобождением ресурсов сразу избегается. С ними деструкторы вообще можно не писать.
              Ответить
              • > С ними деструкторы вообще можно не писать.
                Асинхронный сервак, 90+ классов, ни одного деструктора, ни одного delete, полёт нормальный ;)
                Ответить
            • Ну вот от этих 3 классов, емнип, после инлайна останутся банальные new и delete, как и в ручном варианте.

              Зато удобней на порядок: писать меньше, и невозможно забыть delete ;)
              Ответить
        • ==Проверка на NULL говорит о том, что непонятно где указатель инициализируется, может в каком-то методе Init. А должен инициализироваться в конструкторе.==
          Давно отошёл от С++, может скажу глупость:)

          Возможно присваиванием NULL хотят упростить жизнь деструкторам наследников или потомков объекта?.. Если код очень давнишний (старше самого Facebook-а), то такое могло случиться.
          Ответить
          • >присваиванием NULL хотят упростить жизнь деструкторам наследников или потомков объекта
            Деструкторы наследников вроде бы уже вызваны, если работает деструктор предка.
            Как именно можно упросить жизнь?

            Есть мнение что такие финты, когда один объект удаляет что-то, что может понадобиться другому объекту не есть хорошо. Есть класс, у него есть "область ответственности" по переменным, он не должен инициализировать/удалять что-то из родительских/дочерних классов.
            Ответить
            • Возможно, используются голые указатели на объект. В таком случае случайное обращение к полю удалённого объекта с большим шансом вызовет разыменование нулевого указателя и краш вместо UB.
              Ответить
              • > используются голые указатели на объект.
                Зачем? Здесь явное отношение владения. scoped_ptr, auto_ptr, unique_ptr вполне решают задачу.

                > случайное обращение к полю удалённого объекта
                man valgrind. Под эту вашу винду тоже должны быть аналоги. Никакого повода уродовать код присваиванием NULL'ов в деструкторе ради этого не вижу. В конце-концов, в отладочных целях, можно ведь немного похачить стандартную либу, заставив ее занулять память при деаллокации.

                > краш вместо UB
                Разыменование нулевого указателя - UB, несмотря на то, что чаще всего оно крашится. (c++98, 1.9 Program execution, пункт 4: Certain other operations are described in this International Standard as undefined (for example, the effect of dereferencing the null pointer).
                Ответить
          • > деструкторам наследников или потомков
            А какое дело деструкторам потомков до полей родителя? :)
            Если они туда лезут, особенно в деструкторе - то программист явно неадекват.
            А предок к потомкам в деструкторе вообще слазить не может. Ибо потомка уже нет.
            Ответить
            • при условии что программист адекватен. но увы....
              Ответить
            • Программисты бывают разные, как и объекты ими порождаемые:)

              Но если в ГК некоторые объекты дружественные, или имеют статические данные?.. Конечно, без описания класса и его конструктора, можно разное говорить о деструкторе и его поведении.
              Ответить
              • Ну про остальные методы погорячился, изредка доступ к унаследованным полям нужен :) Но вот в деструкторе лезть к ним всяко не стоит.
                Ответить
        • > непонятно где указатель инициализируется, может в каком-то методе Init
          Более того, если указатель не проинициализирован в конструкторе (хотя бы NULL'ом), то в нем будет мусор. Из-за этого проверка на не NULL с ненулевой вероятностью будет успешной и delete запорет кучу или крашнется ;)
          Ответить
    • показать все, что скрытоc++ адкси упоротый ЯП, 100500 возможностей выстрелить себе в ногу из веревки, из задницы реализованное ООП, которое не вынести мозх не может. О чем думал труп страуса и что он курил, когда это рарабатывал.
      Чесн-слово Сишка гороздо приятней.
      Ответить
      • Не нравится - не используй, никто ведь не заставляет
        Ответить
      • и еще, зачем в деструкторе инициализировать об.ъекты нуллом, накой это надо - это же деструктор.
        Ответить
      • Он думал об практическом применении - много щас пишут на языках у которых "Академическое ООП"? Неа, а тогда в 80-тые когда у процов разрядность 16бит была - тем более каждый чих рантайм проверять "можно или нет" было по производительности накладно, да и сейча не гут.
        Ответить

    Добавить комментарий