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: ожидается проверкаожидаются исправления

Ты правильно сделала два оператора[] -- константный и неконстантный, но почему-то неконстантный оператор по прежнему возвращает константную ссылку. Из-за чего код vec[i] = 10; не компилируется.

Половина тестов попадало с ошибками валгринда. Даже простой тест на push_back говорит, что у тебя утечки. Тест на resize свалился по сегфолту. Тесты на гарантии исключений тоже попадали.

Вижу, что копируешь элементы через memcpy. Это некорректно. Представь, что у тебя Т -- это класс, который в конструкторе выделяет память, в деструкторе её освобождает. Если ты скопируешь такие элементы через memcpy, то объекты-копии будут указывать на ту же память, что и исходные, а значит в деструкторе у тебя будет double free и сегфолты.

Еще замечания:

  1. Оператор присваивания лучше переписать через swap-trick.
  2. push_back, resize и reserve у тебя почти копи-пастят друг друга, можно одно через другое выразить

Пока что 5/10

comment:2 Changed 3 years ago by predelina.anastasiya

Type: ожидаются исправленияожидается проверка
Version: 1.02.0
  1. убрала const из неконстантного оператора[]
  2. изменила конструктор
  3. добавила swap-trick в оператор=
  4. убрала копипасту из push_back и resize

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

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

Не компилируется.
Во-первых, ты используешь метод swap который ты не определила.
Во-вторых, у тебя push_back вызывает resize, который создает новый объект с помощью конструктора по умолчанию (а у типа Т может не быть конструктора по умолчанию), а во-вторых присваивает его с помощью оператора присваивания, которого у Т может тоже не быть.

Я исправил, собралось. Теперь проблемы по тестам:

  1. В push_back ты сначала вызываешь деструктор, а потом оператор присваивания на уже разрушенном объекте -- это UB, почти гарантированный сегфолт (с которым тесты и попадали)
  2. Копирующий конструктор тоже копирует элементы через оператор присваивания. Во-первых, оператора присваивания может в классе не быть, а во-вторых, ты на непроинициализированном объекте вызываешь оператор присваивания -- это тоже UB и сегфолт.

Ну и по мелочи:

  1. Почему у тебя push_back стал принимать объекты по значению, а не по ссылке?

Итого 5/10

Note: See TracTickets for help on using tickets.