#588 closed ожидается проверка (задача сдана)
WW#11
Reported by: | Terova Valeriia | Owned by: | Святослав Власов |
---|---|---|---|
Component: | WW_vector | Version: | 2.0 |
Keywords: | Cc: |
Description
Change History (3)
comment:1 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
А у меня все компилировалось :) Видимо, какие-то не те флаги компилятора у меня стоят 🤔
Вроде бы я все поправила. Все STL переписала ручками.
Единственное, я не очень разобралась, как понять, что строгие гарантии исключений соблюдены, а точнее – как детектить те места, где потенциально эти exceptions
могут возникнуть, чтобы их обработать.
comment:3 Changed 3 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
8.5/10
- Вектор не должен требовать наличия оператора присваивания для типа Т. У тебя требует.
- При копировании вектора
capacity_
по прежнему не совпадает. unitialized_copy
у тебя, конечно, всё подчищает, но он не пробрасывает исключение выше, поэтому ты получишь вектор в неконсистентном состоянии
В целом с гарантиями исключений у тебя всё плохо, они не выполняются вообще никак.
Как детектить места -- создать класс типа такого:
class Throwable { public: static int throw_in_ctor = 0; static int throw_in_copy_ctor = 0; int _id; Throwable(int id) : _id(id) { if (throw_in_ctor && --throw_in_ctor) throw std::logic_error("ctor exception"); } Throwable(const Throwable& oth) : _id(oth.id) { if (throw_in_copy_ctor && --throw_in_copy_ctor) throw std::logic_error("copy ctor exception"); } ~Throwable() { _id = 0xDEADCAFE; } };
И теперь можешь создать вектор таких объектов и крутить по всякому
Например:
my_vector<Throwable> vec; vec.push_back(10); vec.push_back(20); Throwable::throw_in_copy_ctor = 1; // на следующем копирующем конструкторе полетит исключение try { vec.push_back(30); } catch (...) { assert(vec.size() == 2); // проверяем, что вектор в консистентном состоянии assert(vec.capacity() == 2); assert(vec[0]._id == 10); assert(vec[1]._id == 20); }
Note: See
TracTickets for help on using
tickets.
Не компилируется жеж :(
Клёво что ты знаешь алгоритмы STL, но в этом задании нужно написать вектор руками со всеми inplace-new, ручными вызовами деструкторов и прочими низкоуровневыми радостями. В будущих лабах у вас еще будет возможность поиграть со стандартной библиотекой, а здесь, пожалуйста, перепиши без использования алгоритмов STL.
capacity
тоже должен совпадать.По стилю код мне очень нравится, осталось довести его до работающего состояния :)
Сейчас 7/10