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

    +163

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    int F(x)
    {
       if (.chto-to) v.push_back(.koe-chto.);
       int ind = somefunc(x);
       for each y in x.childs
          v[ind].res += F(y);
    }

    Не говнокод, но пример того, как из std::vector можно выстрелить себе в ногу

    Комментарий автора кода ( http://codeforces.ru/blog/entry/1719#comment-32824 ):
    такая штука получала крэш на компиляторе жюри, из-за того что сначала вычислялся адрес v[ind].res затем вызывалась снова F, которая пушбекает в вектор v, и может тем самым заставить вектор перевыделить память, тем самым адрес вычисленный ранее становился инвалидным.
    я этот баг долго не мог найти, потомучто студия генерила нормальный код, не вызывающий креша

    Запостил: burdakovd, 18 Апреля 2011

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

    • (Для полной иллюстранции проблемы надо было бы показать, что все вызовы 'F' используют один и тот же 'v'.) А выстрелить себе в ногу соврешенно аналогичным образом можно в любом коде, использующем динамическую память. Ни к std::vector, ни к "плюсам" это прямого отношения не имеет, вопреки тому, что пытался утверждать автор исходного комментария.
      Ответить
    • По-моему тут не crash, а просто не внимательность
      Ответить
      • Понятно, что невнимательность.
        Но меня побудил запостить сюда этот код тот факт, что я при беглом взгляде на код не увидел подозрительных мест. И если бы не комментарий рядом, неизвестно сколько бы времени пытался понять что тут не так.

        Если вы сразу увидели проблему в коде, то рад за вас.
        Ответить

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