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

    +69.8

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    vector<int> :: iterator itBegins = array.begin(); 
    vector<int> :: iterator itEnds = array.end();
    
    while(itBegins != itEnds)
    {
             pVec.pop_back();
             it++;
    }

    Сей артефакт остался в коде ввиду лености переписывать его в 100 файлах сразу после удаления того, ради чего собственно затевался while(!pVec.empty()) ... прямо скажем - отлов ЭТОГО занял немало времени и нервов... тк на первый взгляд оно должно... а что ты видишь в этом коде, %юзернейм% ?

    (исправленная версия XD )

    Запостил: Zeks, 02 Ноября 2009

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

    • Ты хуй!
      Ответить
    • Так как itEnds не меняется, то с какого-то места итератор пойдёт по мусору. Правда сильно зависит от реализации STL. А ещё it++ не эффективно - надо ++it.
      Ответить
      • В Саттере и похуже ситуации описаны. Здесь просто сравниваются константные итераторы, которые никогда не равны.
        И ещё тут написано, что выбивают элемент из pVec, а итераторы на какой-то array...
        vector сложный контейнер, думаю он легко отследит, что pop_back выполняется на пустом векторе, и просто будет в цикле крутиться до морковкиного заговенья.
        Ответить
        • >морковкиного заговенья
          :)))
          Ответить
          • Да.
            "Ну ничего. Я готов ждать Сяо-Феня хоть до морковкина заговенья" (с) =]
            Ответить
      • сомневаюсь, что стоит рассматривать реализацию stl, отличную от стандартной :) иначе это уже не stl.
        Ответить
        • Они все стандартные.
          Просто, стандарт предоставляет относительную "вольность". Например стандарт не определяет размер буфера для vector и даже не определяет, что этот буфер должен быть. А valarray может предполагать, что объект, в нём лежащий, всегда можно побитово скопировать. Но если valarray поддерживает глубокое копирование и не только POD объекты, то это не делает stl не стандартной.
          Ответить
          • * точнее не делает не стандартной реализацию stl
            Ответить
      • >с какого-то места итератор пойдёт по мусору
        Я, пока лазил и искал что-то по vector.clear(), нашёл, что pop_back() ничего никому не обязан... И на пустом векторе может произойти что угодно... Так что крутилка эта может иметь ещё и последствия...
        Ответить
    • Хм, а зачем было какой-то код повторять аж 100 раз?

      Тем более на Ваш случай можно воспользоваться, к примеру, sed-ом :)
      Ответить
    • Я немного накосячил - не смог найти собственно оригинальный код поэтому восстанавливал по памяти. Итератор разумеется itBegins++, а не it++.

      Про sed знаю - этот кусок кода активно генерится с помощью него в том числе, но это надо было выгружаться в линукс тк програмлю я на работе под виндой... :) Вот в результате лености лишний раз перезагрузиться и применения "Заменить в файлах" вместо требовавшегося перегенерирования cpp`шников и появился сей артефакт)
      Ответить
      • Тогда всё становится лучше.
        И действительно по идее всё удаляется.
        Мы же не разименовываем итераторы, потому указывающие не известно куда итераторы, которые, вероятно, нигде больше не используются, не страшны.
        Ответить
        • Лучше не становится... с каждым pop_back конец вектора смещается ровно на одно деление влево. А итератор как раз слева, соответственно, растет... посередине они встретятся)
          Ответить
          • А вообще я боюсь что я сам запутался в своём же говнокоде и что в нем происходит)
            Ответить
            • Не встретятся...
              После pVec.pop_back() a.end() не равняется itEnds. Это и называется invalidate iterators.

              >я боюсь что я сам запутался
              Именно по этому не стоит забивать себе голову итераторами, когда можно проще. =]
              Ответить
              • * pVec.end() Сначала скопировал array.end(), потом хотел поправить и что-то голову заклинило...
                Ответить
          • Итератор в стиле STL указывает, скажем так, "между" двумя элементами. Если удалить их оба будет зло. У end() итератора по определению справа элемента уже нет. Так что если сделать pop_back(), то ...
            Ответить
    • Соответственно и pVec и array это одно и то же) Жаль нельзя редактировать тут...
      Ответить

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