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
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 4 years ago by
Version: | → 1.0 |
---|
comment:3 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
Это всё ещё не рабочий кусок какой-то фигни, но он теперь хотя бы компилируется, я сейчас его залил просто чтобы было хоть что-то относительно адекватное, не обязятельно его проверять, я ещё постараюсь поправить.
comment:4 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Ок, напишите тогда, когда можно будет смотреть. Если за семь дней ничего не изменится, как-то оценю то, что есть.
comment:5 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
Я всё починил наконец, вроде должно нормально работать (но это не точно).
comment:6 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Я всё починил наконец, вроде должно нормально работать (но это не точно).
Увы, не работают даже ваши тесты:
{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.
Таки да, не компилируется. И много на что ругается. Доделывайте.
Если будут конкретные вопросы по реализации - пишите.