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

    +160

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    for( int b = 0; b < cntblocket; ++b )
    {
        delete msrLst[b]->record;
        delete msrLst[b]->record;
    }

    Сразу вспоминается: "- А зачем у вас тут два одинаковых jump'а стоять? - А вдруг один не сработает?"

    Видимо, совсем не выспался программист ;)

    Запостил: ftptrash, 13 Ноября 2010

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

    • копипастнул и забыл исправить
      Ответить
    • два джампа ничего плохого не сделают, а вот два delete - вполне могут.
      Ответить
    • явные delete? я надеюсь, что приведенный код - часть десктруктора
      Ответить
      • важнее, что их 2 подряд, одинаковых. Хорошо хоть такие косяки отлавливаются довольно легко.
        Ответить
        • > отлавливаются довольно легко.
          с этого места поподробнее, плиз.
          Ответить
          • в классе msrLst[b]->record (назовем его test)
            способ 1:
            добавим static int ObjCount;
            int test::ObjCount = 0;
            в конструкторе ObjCount ++;
            в деструкторе if ((-- ObjCount) < 0) throw ....;
            при выполнении получим что такое вообще имеет место быть - теперь знаем что искать. искать придется вручную.
            способ 2:
            Делаем сингл-тон хеш-таблицу.
            в конструкторе test:
            hash[int(this)] = this;
            в деструкторе test:
            if (hash[int(this)] == NULL) throw ...; // тут получим конкретный вызов
            hash[int(this)] = NULL;
            Ответить
            • Хорошо, но для этого надо сначала класс локализовать.
              Ответить
            • кидать в деструкторах - плохо.
              надо бы хотя бы добавить
              if(--ObjCount < 0 && !uncaught_exception()) throw 666;

              потом оборачивать придется все классы и структуры в countable_. т.е.
              class ... : public countable_ { ... };
              Ответить
              • я имел в виду идею, понятно, что ее надо довести до ума.
                Ответить
    • Тест на трезвость :-) "Сколько операторов delete тут написано?"
      Тест на трезвость :-) "Сколько операторов delete тут написано?"
      Ответить
    • Да тут наверняка копипаста и забыл исправить в
      delete msrLst[b]->record;
      слово record на что-то ещё.
      Ответить

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