Opened 3 years ago

Closed 3 years ago

Last modified 3 years ago

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

WW#11

Reported by: Terova Valeriia Owned by: Святослав Власов
Component: WW_vector Version: 2.0
Keywords: Cc:

Description


Change History (3)

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

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

Не компилируется жеж :(

include/my_vector_impl.h:100:37: error: comparison of unsigned expression in ‘< 0’ is always false [-Werror=type-limits]
  100 |         if (size_ <= index || index < 0)
      |                               ~~~~~~^~~

Клёво что ты знаешь алгоритмы STL, но в этом задании нужно написать вектор руками со всеми inplace-new, ручными вызовами деструкторов и прочими низкоуровневыми радостями. В будущих лабах у вас еще будет возможность поиграть со стандартной библиотекой, а здесь, пожалуйста, перепиши без использования алгоритмов STL.

  1. Упал тест на копирование. При копировании capacity тоже должен совпадать.
  2. Тест на ресайз ругнулся ошибками валгринда, что-то у тебя там течет.
  3. Тесты проверяющие строгие гарантии исключений попадали. Часть с утечками, часть из-за того, что вектор не вернулся в изначальное состояние, часть с сегфолтом.

По стилю код мне очень нравится, осталось довести его до работающего состояния :)
Сейчас 7/10

comment:2 Changed 3 years ago by Terova Valeriia

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

А у меня все компилировалось :) Видимо, какие-то не те флаги компилятора у меня стоят 🤔

Вроде бы я все поправила. Все STL переписала ручками.

Единственное, я не очень разобралась, как понять, что строгие гарантии исключений соблюдены, а точнее – как детектить те места, где потенциально эти exceptions могут возникнуть, чтобы их обработать.

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

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

8.5/10

  1. Вектор не должен требовать наличия оператора присваивания для типа Т. У тебя требует.
  2. При копировании вектора capacity_ по прежнему не совпадает.
  3. unitialized_copy у тебя, конечно, всё подчищает, но он не пробрасывает исключение выше, поэтому ты получишь вектор в неконсистентном состоянии

В целом с гарантиями исключений у тебя всё плохо, они не выполняются вообще никак.
Как детектить места -- создать класс типа такого:

class Throwable {
public:
  static int throw_in_ctor = 0;
  static int throw_in_copy_ctor = 0;
  
  int _id;
  Throwable(int id) : _id(id) {
    if (throw_in_ctor && --throw_in_ctor) throw std::logic_error("ctor exception");
  }
  Throwable(const Throwable& oth) : _id(oth.id) {
    if (throw_in_copy_ctor && --throw_in_copy_ctor) throw std::logic_error("copy ctor exception");
  }
  ~Throwable() { _id = 0xDEADCAFE; }
};

И теперь можешь создать вектор таких объектов и крутить по всякому
Например:

my_vector<Throwable> vec;

vec.push_back(10);
vec.push_back(20);
Throwable::throw_in_copy_ctor = 1; // на следующем копирующем конструкторе полетит исключение
try {
  vec.push_back(30);
} catch (...) {
  assert(vec.size() == 2); // проверяем, что вектор в консистентном состоянии
  assert(vec.capacity() == 2);
  assert(vec[0]._id == 10);
  assert(vec[1]._id == 20);
}
Last edited 3 years ago by Святослав Власов (previous) (diff)
Note: See TracTickets for help on using tickets.