Opened 3 years ago
Closed 3 years ago
#570 closed ожидается проверка (задача сдана)
WW #11
Reported by: | predelina.anastasiya | 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 |
- убрала const из неконстантного оператора[]
- изменила конструктор
- добавила swap-trick в оператор=
- убрала копипасту из push_back и resize
comment:3 Changed 3 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Не компилируется.
Во-первых, ты используешь метод swap
который ты не определила.
Во-вторых, у тебя push_back
вызывает resize
, который создает новый объект с помощью конструктора по умолчанию (а у типа Т может не быть конструктора по умолчанию), а во-вторых присваивает его с помощью оператора присваивания, которого у Т может тоже не быть.
Я исправил, собралось. Теперь проблемы по тестам:
- В
push_back
ты сначала вызываешь деструктор, а потом оператор присваивания на уже разрушенном объекте -- это UB, почти гарантированный сегфолт (с которым тесты и попадали) - Копирующий конструктор тоже копирует элементы через оператор присваивания. Во-первых, оператора присваивания может в классе не быть, а во-вторых, ты на непроинициализированном объекте вызываешь оператор присваивания -- это тоже UB и сегфолт.
Ну и по мелочи:
- Почему у тебя
push_back
стал принимать объекты по значению, а не по ссылке?
Итого 5/10
Note: See
TracTickets for help on using
tickets.
Ты правильно сделала два оператора[] -- константный и неконстантный, но почему-то неконстантный оператор по прежнему возвращает константную ссылку. Из-за чего код
vec[i] = 10;
не компилируется.Половина тестов попадало с ошибками валгринда. Даже простой тест на push_back говорит, что у тебя утечки. Тест на resize свалился по сегфолту. Тесты на гарантии исключений тоже попадали.
Вижу, что копируешь элементы через
memcpy
. Это некорректно. Представь, что у тебя Т -- это класс, который в конструкторе выделяет память, в деструкторе её освобождает. Если ты скопируешь такие элементы черезmemcpy
, то объекты-копии будут указывать на ту же память, что и исходные, а значит в деструкторе у тебя будет double free и сегфолты.Еще замечания:
push_back
,resize
иreserve
у тебя почти копи-пастят друг друга, можно одно через другое выразитьПока что 5/10