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

    +161

    1. 1
    2. 2
    3. 3
    std::auto_ptr<ItemDesc> desc(new ItemDesc());
    ...
    m_items.insert(desc->m_item->m_name, desc.release());

    Да, я тоже говнокодер. А ведь предупреждали...

    Запостил: Kirinyale, 16 Февраля 2011

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

    • И что? В чём говнокод?
      Ответить
      • Может быть в desc.release() ?
        Правда хотелось бы узнать, что за тип у m_items.
        Ответить
        • Вот без release() был бы говнокод.
          Ответить
          • Аргументируйте
            Ответить
            • Отсутствие release() почти наверняка означало бы, что в контейнере сидят auto_ptr со всем истекающим.

              Kirinyale ниже объяснил, в чём на самом деле говнокод.
              Ответить
        • тип m_items - boost::ptr_map
          Ответить
      • Говнокод в том, что порядок вычисления аргументов никем не зафиксирован.

        Пришлось долго и вдумчиво ловить крэш на релизе из-за того, что после оптимизаций release() выполнялся раньше, а при вычислении первого аргумента шло обращение уже к нулевому указателю.
        Ответить
        • Да, не заметил, что в том же выражении desc используется дважды. Тогда говнокод, согласен.

          desc->m_item->m_name следовало бы выделить в отдельную переменную.
          Ответить
          • Так и сделал, когда заметил. Точнее, выделил в переменную релизнутый указатель, чтоб не копировать строку.

            Мейерс о такой хрени писал. А я читал. Но забыл.
            Ответить
            • Если m_item->m_name гарантированно не вызывает исключения, то можно (и лучше) и указатель.
              Ответить

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