Opened 4 years ago

Closed 4 years ago

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

WW #12

Reported by: Tarabonda German Owned by: Дмитрий Свиридкин
Component: WW_vector Version: 3.0
Keywords: Cc:

Description


Change History (5)

comment:1 Changed 4 years ago by Дмитрий Свиридкин

Owner: changed from Дмитрий Свиридкин to Tarabonda German
Type: ожидается проверкаожидаются исправления

почему reserve создает новые объекты, а resize ведет себя как reserve при увеличении размера, но как resize при уменьшении?

Зачем resize реаллоцирует контейнер при уменьшении размера?

new (holder_.array_ + holder_.size_) T;
Добавьте скобки.
https://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name-make-a-difference-with-new

Оператор перемещения как-то очень странно перемещает. Больше похоже на копию

my_vector::my_vector<T>::my_vector(my_vector<T>& other) Это не конструктор копий. У конструктора копий должен быть const.

А где конструктор перемещения?

    template<typename T>
    my_vector<T> &my_vector<T>::operator=(my_vector other);

    template<typename T>
    my_vector<T> &my_vector<T>::operator=(my_vector &&other) noexcept 

Две такие сигнатуры одновременно не уживаются.

Никакую функцию, не требующую конструирования объектов, нельзя реализовывать через resize

Last edited 4 years ago by Дмитрий Свиридкин (previous) (diff)

comment:2 Changed 4 years ago by Tarabonda German

Owner: changed from Tarabonda German to Дмитрий Свиридкин
Version: 1.02.0

comment:3 Changed 4 years ago by Дмитрий Свиридкин

Owner: changed from Дмитрий Свиридкин to Tarabonda German
include/my_vector_impl.h:19:29: error: assignment of member ‘my_vector::my_vector<Product>::my_vector_holder::capacity_’ in read-only object
   19 |     other.holder_.capacity_ = 0;
      |     ~~~~~~~~~~~~~~~~~~~~~~~~^~~
include/my_vector_impl.h:20:25: error: assignment of member ‘my_vector::my_vector<Product>::my_vector_holder::size_’ in read-only object
   20 |     other.holder_.size_ = 0;
      |     ~~~~~~~~~~~~~~~~~~~~^~~
include/my_vector_impl.h:21:26: error: assignment of member ‘my_vector::my_vector<Product>::my_vector_holder::array_’ in read-only object
   21 |     other.holder_.array_ = nullptr;


include/my_vector_impl.h:19:29: error: assignment of member ‘my_vector::my_vector<Product>::my_vector_holder::capacity_’ in read-only object
   19 |     other.holder_.capacity_ = 0;
      |     ~~~~~~~~~~~~~~~~~~~~~~~~^~~
include/my_vector_impl.h:20:25: error: assignment of member ‘my_vector::my_vector<Product>::my_vector_holder::size_’ in read-only object
   20 |     other.holder_.size_ = 0;
      |     ~~~~~~~~~~~~~~~~~~~~^~~
include/my_vector_impl.h:21:26: error: assignment of member ‘my_vector::my_vector<Product>::my_vector_holder::array_’ in read-only object
   21 |     other.holder_.array_ = nullptr;

С сигнатурами операторов все так же проблемы. Должно быть два оператора. Копирования и перемещения.

resize нарушает строгую гарантию исключений.

в reserve нужно делать move элементов

в resize UB.

comment:4 Changed 4 years ago by Tarabonda German

Owner: changed from Tarabonda German to Дмитрий Свиридкин
Type: ожидаются исправленияожидается проверка
Version: 2.03.0

comment:5 Changed 4 years ago by Дмитрий Свиридкин

Resolution: задача сдана
Status: assignedclosed
include/my_vector_impl.h:27:31: error: binding reference of type ‘my_vector::my_vector<ThrowingClass>::my_vector_holder&’ to ‘const my_vector::my_vector<ThrowingClass>::my_vector_holder’ discards qualifiers
   27 |         holder_.my_swap(other.holder_);
      |                         ~~~~~~^~~~~~~
In file included from src/main.cpp:3:
include/my_vector.h:50:40: note:   initializing argument 1 of ‘void my_vector::my_vector<T>::my_vector_holder::my_swap(my_vector::my_vector<T>::my_vector_holder&) [with T = ThrowingClass]’
   50 |         void my_swap(my_vector_holder& other) {
      |                      ~~~~~~~~~~~~~~~~~~^~~~~
In file included from /usr/include/c++/9/cassert:44,
                 from src/main.cpp:10:
src/main.cpp: In instantiation of ‘void test_move() [with T = int]’:
src/main.cpp:910:24:   required from here
src/main.cpp:796:27: error: ambiguous overload for ‘operator=’ (operand types are ‘myvec<int>’ {aka ‘my_vector::my_vector<int>’} and ‘std::remove_reference<my_vector::my_vector<int>&>::type’ {aka ‘my_vector::my_vector<int>’})

    holder_.my_swap(other.holder_);
    other.holder_.capacity_ = 0;
    other.holder_.size_ = 0;
    other.holder_.array_ = nullptr;

Такая реализация оператора перемещения приведет к утечке памяти. Кто содержимое исходного вектора-то очистит?

resize нарушает строгую гарантию исключений.


6.5

Note: See TracTickets for help on using tickets.