Кресты / Говнокод #6391 Ссылка на оригинал

0

  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 burdakovd, (Updated )

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

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

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

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8