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 Sokolov Viacheslav

Type: ожидается проверкаожидаются исправления

Если я правильно понимаю, то задача была сдана перед deadline-ом, соответственно версия 2 - финальная. Поправьте, если ошибаюсь.

9 template <typename T> class my_vector {

final

14 my_vector(my_vector &&);
noexcept

16 my_vector &operator=(my_vector &&);
noexcept

32 void clear();
noexcept

31 void pop_back();
noexcept

13 my_vector<T>::my_vector() : _capacity(0), _size(0), _array(nullptr) {}

с такой реализацией - noexcept

16 my_vector<T>::my_vector(size_t n) : _capacity(0), _size(0), _array(nullptr) {
можно позвать делегирующий конструктор : my_vector{} {
при этом это не эквивалентно, потому что в текущем варианте объект будет считаться сконструированным после выходы из {}, а в случае с делегирующим конструктором - после выхода из него. Это влияет на то, позовется или нет деструктор в случае возникновения исключения в теле конструктора.

34 template <typename T> my_vector<T>::my_vector(my_vector &&other) {
35 _size = 0;
36 _capacity = 0;
37 _array = nullptr;
38 swap(other);
39 }

проще через делегирующий конструктор

48 template <typename T> my_vector<T> &my_vector<T>::operator=(my_vector &&other) {
49 my_vector<T> copy(other);
50 swap(copy);
51 return *this;
52 }

здесь копия не нужна вообще, но если была бы нужна, то std::move

48 template <typename T> my_vector<T> &my_vector<T>::operator=(my_vector &&other) {
49 my_vector<T> copy(other);
50 swap(copy);
51 return *this;
52 }

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}

86 new (_array + i) T;

это не эквивалентно T{}, должен быть второй вариант. Отличие - для примитивных типов.

28 } catch (...) {
88 } catch (...) {

здесь нужно перебросить исключение (throw)

comment:2 Changed 4 years ago by Sokolov Viacheslav

Resolution: задача сдана
Status: assignedclosed
Note: See TracTickets for help on using tickets.