Change History (4)

comment:1 Changed 3 years ago by Святослав Власов

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

Во-первых, упала компиляция. У тебя не хватает константного оператора[], поэтому чтение элементов по индексу у константных ссылок на вектор не работает.
Во-вторых компиляция сломалась из-за опечатки в этом же самом операторе [] (size вместо size_)
В-третьих компиляция упала из-за того, что у тебя my_vector.h не инклюдит заголовочники, от которых он зависит. Если my_vector.h заинклюдить самым первым в списке инклюдов -- компиляция упадет.

После того как я починил твою компиляцию, тесты запустились но из них упали следующие:

  1. Тест на init, потому что твой конструктор от size_t n работает не так, как требуется в задании
  2. Тест на pop_back упал на ошибках валгринда (а мог бы с сегфолтом), потому что у тебя pop_back освобождает не тот элемент который надо (вспоминай чем постфиксный от префиксного декремента отличаются)
  3. Тест на resize, потому что строчка new (...) T;(без круглых скобок) создаст непроинициализированный объект в случае, если T -- это POD объект (Plain Old Data, т.е. структура без конструктора и с полями примитивных типов). Поэтому используй явный вызов конструктора по умолчанию new (...) T();.

Общие замечания:

  1. У тебя есть UB в следующем случае -- ты в конструкторе от size_t n выделяешь память оператором new [] T, а в деструкторе освобождаешь через delete [] char. Это потенциальный UB. Нельзя выделять и освобождать память через new/delete разных типов.
  2. Нет смысла в блоке try-catch в функции init. Всё что делает твой catch -- это обнуляет поля класса. Но init у тебя используется только в конструкторах, поэтому если из него кинется исключение, то объект просто не будет создан, поэтому толку в это обнулении нет. То же самое касается ловли bad_alloc в конструкторах.
  3. Из конструкторов T могут лететь любые исключения, а ты ловишь только bad_alloc. Твой catch их просто проигнорит, а ты получишь утечку.

В остальном к коду претензий нет. Пока 6/10

comment:2 Changed 3 years ago by Маргарита Михельсон

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

comment:3 Changed 3 years ago by Святослав Власов

Resolution: задача сдана
Status: assignedclosed

Базовые тесты прошли. По тестам на гарантии исключений не прошли те, что проверяют resize и push_back, у тебя вектор не возвращается в предыдущее состояние, если в этих методах конструктор Т стреляет эксепшеном. Происходит это из-за reserve, у тебя может измениться размер буфера и он не вернется назад.

В остальном мне твой код очень нравится, я даже не буду снимать баллы за неполные гарантии. 10/10.

comment:4 Changed 3 years ago by Святослав Власов

Стоп, я проморгал у тебя значительную ошибку -- в push_back у тебя не просто строгая гарантия не выполняется, у тебя не выполняется базовая гарантия -- если в конструкторе Т внутри push_back вылетит исключение, то инкремент size_ у тебя к тому моменту будет выполнен, а значит вектор останется в неконсистентном состоянии.

9.5/10

Note: See TracTickets for help on using tickets.