Opened 4 years ago

Closed 4 years ago

#824 closed ожидается проверка (задача сдана)

WW #12

Reported by: Igor Engel Owned by: Sokolov Viacheslav
Component: WW_vector Version: 1.0
Keywords: Cc:

Description


Change History (4)

comment:1 Changed 4 years ago by Sokolov Viacheslav

src/main.cpp: In function ‘char* strdup(const char*)’:
src/main.cpp:9:5: error: nonnull argument ‘s’ compared to NULL [-Werror=nonnull-compare]

9 | if(s == nullptr) return nullptr;

| ~

cc1plus: all warnings being treated as errors
Makefile:20: recipe for target 'obj/main.o' failed
make: * [obj/main.o] Error 1

если убрать из глобального пространства имен, то собирается. Видимо каким-то образом приезжает декларация

::strdup([[gnu::nonnull]] const char* )

comment:2 Changed 4 years ago by Sokolov Viacheslav

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

16 my_vector<T>& operator=(my_vector other) noexcept; Нормально-ли помечать его noexcept, при том, что исключение может произойти, при копировании параметра?

да. https://godbolt.org/z/rCHVaV

40 size_t capacity_ = 0;
41 size_t size_ = 0;
42 T* array_ = nullptr;

какая мотивация делать инициализацию в месте объявления?

include/my_vector_impl.h:
не хватает разных include-ов. Например, assert, stdexcept, ostream, ... используются, но не подключены.

Для упрощения обработки конструктора можно было бы сделать вложенный класс, который в деструкторе освободит то, что уже успели заполнить (его деструктор позовется, если исключение вылетит из тела конструктора vector-а).

122 template<typename T>
123 T& my_vector<T>::operator[](std::size_t index) noexcept {
124 return array_[index];
125 }
126
127 template<typename T>
128 const T& my_vector<T>::operator[](std::size_t index) const noexcept {
129 return array_[index];
130 }
131
стоит проверить, что нет выхода за границы.

97 while(base < n) {
98 base <<= 1;
99 }

может зациклиться, если base переполнится. Наверное, есть какое-то предположение про n.

84 my_vector<T> copy = *this;
85 copy.resize_dangerous(n);
86 swap(copy);

если n < capacity_, то дополнительная аллокация не требуется.
Копирование элементов избыточно, даже если аллокация необходимо, можно использовать move.

43 template<typename T>
44 my_vector<T>& my_vector<T>::operator=(my_vector<T> other) noexcept {
45 swap(other);
46 }

не хватает return *this;

test_my_vector_default_constructable
typo constructible

Не все методы покрыты тестами (например, operator= не протестирован)

comment:3 Changed 4 years ago by Igor Engel

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

ок.

Чтобы не повторять их во всех конструкторах

Добавил

Да, но уже написал так...

Добавил

Поправил

Переписал. Кажется, move'ать элементы перед тем, как добавлять новые надо, чтобы можно было гарантировать, что порядок разрушения будет обратным порядку конструированния.

Поправил.

Поправил.

Поправил.

comment:4 Changed 4 years ago by Sokolov Viacheslav

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