#562 closed ожидается проверка (задача сдана)
WW #11
Reported by: | Маргарита Михельсон | Owned by: | Святослав Власов |
---|---|---|---|
Component: | WW_vector | Version: | 2.0 |
Keywords: | Cc: |
Description
Change History (4)
comment:1 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:3 Changed 3 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Базовые тесты прошли. По тестам на гарантии исключений не прошли те, что проверяют resize и push_back, у тебя вектор не возвращается в предыдущее состояние, если в этих методах конструктор Т стреляет эксепшеном. Происходит это из-за reserve
, у тебя может измениться размер буфера и он не вернется назад.
В остальном мне твой код очень нравится, я даже не буду снимать баллы за неполные гарантии. 10/10.
comment:4 Changed 3 years ago by
Стоп, я проморгал у тебя значительную ошибку -- в push_back
у тебя не просто строгая гарантия не выполняется, у тебя не выполняется базовая гарантия -- если в конструкторе Т внутри push_back вылетит исключение, то инкремент size_
у тебя к тому моменту будет выполнен, а значит вектор останется в неконсистентном состоянии.
9.5/10
Во-первых, упала компиляция. У тебя не хватает константного оператора[], поэтому чтение элементов по индексу у константных ссылок на вектор не работает.
Во-вторых компиляция сломалась из-за опечатки в этом же самом операторе [] (
size
вместоsize_
)В-третьих компиляция упала из-за того, что у тебя my_vector.h не инклюдит заголовочники, от которых он зависит. Если my_vector.h заинклюдить самым первым в списке инклюдов -- компиляция упадет.
После того как я починил твою компиляцию, тесты запустились но из них упали следующие:
size_t n
работает не так, как требуется в заданииpop_back
упал на ошибках валгринда (а мог бы с сегфолтом), потому что у тебяpop_back
освобождает не тот элемент который надо (вспоминай чем постфиксный от префиксного декремента отличаются)resize
, потому что строчкаnew (...) T;
(без круглых скобок) создаст непроинициализированный объект в случае, если T -- это POD объект (Plain Old Data, т.е. структура без конструктора и с полями примитивных типов). Поэтому используй явный вызов конструктора по умолчаниюnew (...) T();
.Общие замечания:
size_t n
выделяешь память операторомnew [] T
, а в деструкторе освобождаешь черезdelete [] char
. Это потенциальный UB. Нельзя выделять и освобождать память черезnew/delete
разных типов.try-catch
в функцииinit
. Всё что делает твой catch -- это обнуляет поля класса. Ноinit
у тебя используется только в конструкторах, поэтому если из него кинется исключение, то объект просто не будет создан, поэтому толку в это обнулении нет. То же самое касается ловлиbad_alloc
в конструкторах.bad_alloc
. Твойcatch
их просто проигнорит, а ты получишь утечку.В остальном к коду претензий нет. Пока 6/10