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

    +144.8

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    A* arr = new A[size];
    std::vector<A*> vec(size);
    for(size_t i=0; i<size; ++i)
    	vec.push_back(&a[i])
    // Do something with vec
    delete[] arr;

    Запостил: kokorins, 08 Апреля 2010

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

    • fill(vec.begin(), vec.end(), new A);
      Ответить
      • Ваш код не эквивалентен вышеприведенному, не так ли?
        Ответить
        • Нет, но он короткий и исправляет говнистость исходного =)
          Ответить
    • А что здесь не так, простите?
      Ответить
      • все засунутые в вектор указатели были delete [] => в векторе wild pointers =)
        Ответить
        • Если вектор после приведенного кода прекращает житие - никаких проблем нет.
          Удаление указателей не ведет к вызову деструкторов объектов, на которые они указывают.
          Ответить
          • Как это не ведет? Как по вашему вызывается деструктор объекта? A::~A() чтоли?
            Ответить
            • А вот так вот и не ведет.
              В STL при деструкции контейнера вызываются деструкторы того что в контейнере расположено.
              Для объектов - вызываются деструкторы объектов.
              Для указателей - ничего не вызывается.
              Ответить
      • Код почти чистый:
        1. код бросает исключения как минимум
        2. ради красоты delete[] дублировать массив указателей, это по моему сликом.
        3. Зная длину массива, делать push_back ну как-то "расточительно" чтоли.
        4. Мне потребовалось минут 5 чтобы понять, что хотел сказать автор.
        Ответить

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