Opened 4 years ago
Closed 4 years ago
#846 closed ожидаются исправления (задача сдана)
WW #12
Reported by: | Alexander Morozov | Owned by: | Sokolov Viacheslav |
---|---|---|---|
Component: | WW_vector | Version: | 1.0 |
Keywords: | Cc: |
Description
Change History (2)
comment:1 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Note: See
TracTickets for help on using
tickets.
Если я правильно понимаю, то задача была сдана перед deadline-ом, соответственно версия 2 - финальная. Поправьте, если ошибаюсь.
final
14 my_vector(my_vector &&);
noexcept
16 my_vector &operator=(my_vector &&);
noexcept
32 void clear();
noexcept
31 void pop_back();
noexcept
с такой реализацией - noexcept
16 my_vector<T>::my_vector(size_t n) : _capacity(0), _size(0), _array(nullptr) {
можно позвать делегирующий конструктор
: my_vector{} {
при этом это не эквивалентно, потому что в текущем варианте объект будет считаться сконструированным после выходы из
{}
, а в случае с делегирующим конструктором - после выхода из него. Это влияет на то, позовется или нет деструктор в случае возникновения исключения в теле конструктора.проще через делегирующий конструктор
здесь копия не нужна вообще, но если была бы нужна, то std::move
assert, что в диапазоне
128 new (_array + _size) T(elem);
нарушается strong exceptions guarantee в случае, если исключение произойдет в конструкторе копирования. Нужно сначала (до reserve) сделать копию, а потом позвать rvalue (aka move) ctor.
В resize нарушается strong exceptions guarantee в случае, если произошло перевыделение памяти, а потом зашли внутрь 88 } catch (...) {
(capacity() поменяется, адреса элементов поменяются).
Нужно сделать копию вектора и работать с ней, а потому move.
А зачем, кстати, aligned_alloc, а не malloc?
В методе reserve утекает память (старый _array)
110 new (_array + i) T(std::move(new_array[i])); No exceptions can be thrown
здесь перепутано откуда куда
new_cap, new_cap_pow2
именование можно было бы улучшить (с текущим можно перепутать и использовать new_cap там, где не нужно)
100 size_t new_cap_pow2 = std::max((size_t)4, _capacity);
по условию вроде бы 1 просят
(size_t) - это c-style cast; в C++ лучше size_t{4}
это не эквивалентно T{}, должен быть второй вариант. Отличие - для примитивных типов.
здесь нужно перебросить исключение (throw)