Opened 4 years ago

Closed 4 years ago

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

WW #12

Reported by: Kreslavski Kirill Owned by: Артур Гулецкий (huletski)
Component: WW_vector Version: 2.0
Keywords: Cc:

Description

Оно совсем не работает и не собирается, я залил, чтобы показать, что я не просто фигнёй страдал, а всё-таки что-то делал, просто не получилсоь ничего. Он ругается на static_cast ы, как это пофиксить я не понял. Постараюсь доделать на днях

Change History (6)

comment:1 Changed 4 years ago by Артур Гулецкий (huletski)

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

Таки да, не компилируется. И много на что ругается. Доделывайте.

Если будут конкретные вопросы по реализации - пишите.

comment:2 Changed 4 years ago by Артур Гулецкий (huletski)

Version: 1.0

comment:3 Changed 4 years ago by Kreslavski Kirill

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

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

comment:4 Changed 4 years ago by Артур Гулецкий (huletski)

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

Ок, напишите тогда, когда можно будет смотреть. Если за семь дней ничего не изменится, как-то оценю то, что есть.

comment:5 Changed 4 years ago by Kreslavski Kirill

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

Я всё починил наконец, вроде должно нормально работать (но это не точно).

comment:6 Changed 4 years ago by Артур Гулецкий (huletski)

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

Я всё починил наконец, вроде должно нормально работать (но это не точно).

Увы, не работают даже ваши тесты:

{lab_12}[2487]$ pwd && svn up && svn status
/home/hfx/dvl/cpp19/kreslavskiy.kirill/lab_12
Updating '.':
At revision 3822.
{lab_12}[2488]$ make
mkdir -p obj
g++ -O2 -Wall -Werror -std=c++14 -Iinclude -g -c -MMD -o obj/main.o src/main.cpp
g++ obj/main.o -o lab_12 
{lab_12}[2489]$ valgrind ./lab_12 
==17972== Memcheck, a memory error detector
==17972== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==17972== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==17972== Command: ./lab_12
==17972== 
0 0 0 0 0
5 6
==17972== Mismatched free() / delete / delete []
==17972==    at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17972==    by 0x401B27: my_vector::my_vector<product::Product>::push_back(product::Product const&) (in /home/hfx/dvl/cpp19/kreslavskiy.kirill/lab_12/lab_12)
==17972==    by 0x401BF4: void test_my_vector<product::Product>(product::Product, product::Product) (my_vector_impl.h:20)
==17972==    by 0x40118E: main (main.cpp:32)
==17972==  Address 0x5b1a310 is 0 bytes inside a block of size 48 alloc'd
==17972==    at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17972==    by 0x401987: my_vector::my_vector<product::Product>::reserve(unsigned long) (my_vector_impl.h:96)
==17972==    by 0x401B27: my_vector::my_vector<product::Product>::push_back(product::Product const&) (in /home/hfx/dvl/cpp19/kreslavskiy.kirill/lab_12/lab_12)
==17972==    by 0x401B6D: void test_my_vector<product::Product>(product::Product, product::Product) (main.cpp:76)
==17972==    by 0x40118E: main (main.cpp:32)
==17972== 
==17972== Conditional jump or move depends on uninitialised value(s)
==17972==    at 0x401C45: operator<< <std::char_traits<char> > (main.cpp:58)
==17972==    by 0x401C45: operator<< (main.cpp:58)
==17972==    by 0x401C45: void test_my_vector<product::Product>(product::Product, product::Product) (main.cpp:87)
==17972==    by 0x40118E: main (main.cpp:32)
==17972== 
==17972== Conditional jump or move depends on uninitialised value(s)
==17972==    at 0x40140B: operator<< <std::char_traits<char> > (main.cpp:58)
==17972==    by 0x40140B: operator<< (main.cpp:58)
==17972==    by 0x40140B: std::ostream& my_vector::operator<< <product::Product>(std::ostream&, my_vector::my_vector<product::Product> const&) (my_vector_impl.h:151)
==17972==    by 0x401D16: void test_my_vector<product::Product>(product::Product, product::Product) (char_traits.h:335)
==17972==    by 0x40118E: main (main.cpp:32)
==17972== 
==17972== Conditional jump or move depends on uninitialised value(s)
==17972==    at 0x4014F7: operator<< <std::char_traits<char> > (main.cpp:58)
==17972==    by 0x4014F7: operator<< (main.cpp:58)
==17972==    by 0x4014F7: std::ostream& my_vector::operator<< <product::Product>(std::ostream&, my_vector::my_vector<product::Product> const&) (my_vector_impl.h:152)
==17972==    by 0x401D16: void test_my_vector<product::Product>(product::Product, product::Product) (char_traits.h:335)
==17972==    by 0x40118E: main (main.cpp:32)
==17972== 
==17972== Conditional jump or move depends on uninitialised value(s)
==17972==    at 0x401D74: ~Product (main.cpp:26)
==17972==    by 0x401D74: ~holder (my_vector.h:71)
==17972==    by 0x401D74: ~my_vector (my_vector_impl.h:15)
==17972==    by 0x401D74: void test_my_vector<product::Product>(product::Product, product::Product) (main.cpp:80)
==17972==    by 0x40118E: main (main.cpp:32)
==17972== 
==17972== Mismatched free() / delete / delete []
==17972==    at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17972==    by 0x401DDE: ~holder (my_vector.h:70)
==17972==    by 0x401DDE: ~my_vector (my_vector_impl.h:15)
==17972==    by 0x401DDE: void test_my_vector<product::Product>(product::Product, product::Product) (main.cpp:77)
==17972==    by 0x40118E: main (main.cpp:32)
==17972==  Address 0x5b1a4c0 is 0 bytes inside a block of size 96 alloc'd
==17972==    at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17972==    by 0x401987: my_vector::my_vector<product::Product>::reserve(unsigned long) (my_vector_impl.h:96)
==17972==    by 0x401B27: my_vector::my_vector<product::Product>::push_back(product::Product const&) (in /home/hfx/dvl/cpp19/kreslavskiy.kirill/lab_12/lab_12)
==17972==    by 0x401BF4: void test_my_vector<product::Product>(product::Product, product::Product) (my_vector_impl.h:20)
==17972==    by 0x40118E: main (main.cpp:32)
==17972== 
==17972== 
==17972== HEAP SUMMARY:
==17972==     in use at exit: 72,704 bytes in 1 blocks
==17972==   total heap usage: 17 allocs, 16 frees, 74,069 bytes allocated
==17972== 
==17972== LEAK SUMMARY:
==17972==    definitely lost: 0 bytes in 0 blocks
==17972==    indirectly lost: 0 bytes in 0 blocks
==17972==      possibly lost: 0 bytes in 0 blocks
==17972==    still reachable: 72,704 bytes in 1 blocks
==17972==         suppressed: 0 bytes in 0 blocks
==17972== Rerun with --leak-check=full to see details of leaked memory
==17972== 
==17972== For counts of detected and suppressed errors, rerun with: -v
==17972== Use --track-origins=yes to see where uninitialised values come from
==17972== ERROR SUMMARY: 7 errors from 6 contexts (suppressed: 0 from 0)

А my_vector::op= вообще не компилируется:

{lab_12}[2494]$ tail src/main.cpp 
    // i don't know how to do smth like v[0] = t1
    auto v = my_vector::my_vector<T>(2);
    // here should be something that actually tests
}

int main() {
    my_vector::my_vector<product::Product> v1, v2;
    v1 = v2;
    return 0;
}
{lab_12}[2494]$ make
g++ -O2 -Wall -Werror -std=c++14 -Iinclude -g -c -MMD -o obj/main.o src/main.cpp
In file included from include/my_vector.h:104,
                 from src/main.cpp:6:
include/my_vector_impl.h: In instantiation of ‘my_vector::my_vector<T>& my_vector::my_vector<T>::operator=(const my_vector::my_vector<T>&) & [with T = product::Product]’:
src/main.cpp:100:10:   required from here
include/my_vector_impl.h:33:28: error: ‘class product::Product’ has no member named ‘T’
   33 |                     tmp[i].T(other.storage.data_[i]);
      |                     ~~~~~~~^
Makefile:17: recipe for target 'obj/main.o' failed
make: *** [obj/main.o] Error 1

Если хотели вызвать copy ctor, нужно было написать new (tmp + i) T (other.storage.data_[i], другое дело, что неясно почему op= внутри storage не реализовать.

Замечания напишу самые основные:

  • не компилируется такой код:
    product::Product p("a", 0, 0);
    p = product::Product("blah", 1, 2);
    

my_vector_impl.h

  • 10: если вылетело исключение при создании, например, третьего элемента из семи, вызовется деструктор holder'a, которые попытается удалить все элементы, а не лишь созданные (0ой, 1ый, 2ой);
  • 26: copy-swap idiom;
  • 71: элементы можно переместить, разместив вызов перемещающих op= после всех небезопасных с т.з. исключений операций (выделение памяти, вызов конструкторов по умолчанию);
  • my_vector::reserve. Неясно почему не используете holder для перемещения элементов, копирование не так эффективно; перемешать элементы можно, так как в процессе перемещения исключение не может вылететь по условию (noexcept T::op=(T&&)).
  • по условию capacity должно быть минимальной достаточной степенью двойки для хранения элементов. Такой код падает:
    my_vector::my_vector<int> v;
    v.reserve(20);
    assert(v.capacity() == 32);
    

Баллы: мувов нет, гарантий нет, часть методов работает с ошибками (память, корректность), тесты не работают, код полностью не компилируется -> 1.5.

Note: See TracTickets for help on using tickets.