Opened 4 years ago

Closed 4 years ago

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

WW #11

Reported by: Ruslan Salkaev Owned by: Sokolov Viacheslav
Component: WW cpp_io Version: 2.0
Keywords: Cc:

Description


Change History (5)

comment:1 Changed 4 years ago by Sokolov Viacheslav

Type: ожидается проверкаожидаются исправления
==11342== Memcheck, a memory error detector
==11342== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==11342== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==11342== Command: /home/nicesap/HSE/svn/salkaev.ruslan/lab_11/lab_11
==11342== Parent PID: 11330
==11342== 
==11342== Mismatched free() / delete / delete []
==11342==    at 0x4C3123B: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11342==    by 0x10B5AB: SalesManager::~SalesManager() (in /home/nicesap/HSE/svn/salkaev.ruslan/lab_11/lab_11)
==11342==    by 0x10B326: EmployeesArray::~EmployeesArray() (in /home/nicesap/HSE/svn/salkaev.ruslan/lab_11/lab_11)
==11342==    by 0x109D8E: main (in /home/nicesap/HSE/svn/salkaev.ruslan/lab_11/lab_11)
==11342==  Address 0x5bd5d20 is 0 bytes inside a block of size 101 alloc'd
==11342==    at 0x4C3089F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11342==    by 0x10B1D7: SalesManager::SalesManager() (in /home/nicesap/HSE/svn/salkaev.ruslan/lab_11/lab_11)
==11342==    by 0x10A3F0: add_new_employee(EmployeesArray&) (in /home/nicesap/HSE/svn/salkaev.ruslan/lab_11/lab_11)
==11342==    by 0x109D37: main (in /home/nicesap/HSE/svn/salkaev.ruslan/lab_11/lab_11)
==11342== 
==11342== Mismatched free() / delete / delete []
==11342==    at 0x4C3123B: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11342==    by 0x10B60B: Developer::~Developer() (in /home/nicesap/HSE/svn/salkaev.ruslan/lab_11/lab_11)
==11342==    by 0x10B326: EmployeesArray::~EmployeesArray() (in /home/nicesap/HSE/svn/salkaev.ruslan/lab_11/lab_11)
==11342==    by 0x109D8E: main (in /home/nicesap/HSE/svn/salkaev.ruslan/lab_11/lab_11)
==11342==  Address 0x5bd5e80 is 0 bytes inside a block of size 101 alloc'd
==11342==    at 0x4C3089F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11342==    by 0x10B197: Developer::Developer() (in /home/nicesap/HSE/svn/salkaev.ruslan/lab_11/lab_11)
==11342==    by 0x10A43C: add_new_employee(EmployeesArray&) (in /home/nicesap/HSE/svn/salkaev.ruslan/lab_11/lab_11)
==11342==    by 0x109D37: main (in /home/nicesap/HSE/svn/salkaev.ruslan/lab_11/lab_11)
==11342== 
==11342== 
==11342== HEAP SUMMARY:
==11342==     in use at exit: 0 bytes in 0 blocks
==11342==   total heap usage: 24 allocs, 24 frees, 107,920 bytes allocated
==11342== 
==11342== All heap blocks were freed -- no leaks are possible
==11342== 
==11342== For counts of detected and suppressed errors, rerun with: -v
==11342== ERROR SUMMARY: 5 errors from 2 contexts (suppressed: 0 from 0)

comment:2 Changed 4 years ago by Ruslan Salkaev

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

comment:3 Changed 4 years ago by Sokolov Viacheslav

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

Классы стоит помечать как final, если от них не предполагается наследоваться.

Не все манипуляции проверяются на успешность

В реализации le-операций используется порядок байт в системе

https://stackoverflow.com/questions/4897844/is-sizeofbool-defined-in-the-c-language-standard

В std::ostream &write_c_str::write(std::ostream &os)
68 while (index < sizeof(_str)) {
Видимо, имелось в виду strlen + 1, потому что sizeof(_str) это 4 либо 8
Можно разом вывести все strlen(_str) + 1 символов

Рекомендую посмотреть на ​https://en.cppreference.com/w/cpp/io/basic_istream/getline

Сейчас в функциях явно прописаны значения 1,2, из-за чего страдает расширяемость - при добавлении новых Employee будет тяжело следить за тем, что везде все правильно поддержано. Стоит использовать enum (class), чтобы держать все возможные значения в одном месте.

sizeof(_name) - 1
это 7

os.write((char *) &_employees_number, sizeof(_employees_number));
есть же манипулятор write_le_int32, который специально для этого предназначен

Между add_new_employee и load_file дублируется код, может быть, что-нибудь с этим сделать?

Какая мотивация в манипуляторах в конце метода обнулять указатель?

В EmployeesArray? _employees_number всегда же совпадает с _employees.size()?

Если какая-то манипуляция не удалась, стоит немедленно остановить исполнение (достаточно обозначить намерение и поставить assert, хоть это и неправильно, потому что assert - это предположение об условиях работы, и включать в них отсутствие внешних проблем можно только в учебных целях)

Сейчас между выводом Developer и SalesManager? дублируется часть кода (название должности, id должности, имя), можно было бы вынести это как-то в базовый класс (если это выглядит логичным с точки зрения дальнейшего потенциального расширения - например, способ расчет зарплаты у новых работников скорее всего может отличаться)

comment:4 Changed 4 years ago by Ruslan Salkaev

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

comment:5 Changed 4 years ago by Sokolov Viacheslav

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

Salary -> salary

реализован big endian, а не little endian

53 os.write((char *) &_b, sizeof(_b));

так не стоит делать, поскольку sizeof(bool) не обязательно 1, а в формате просят 1 байт

не все манипуляции с потоками std::cin, std::cout проверяются на успешность (например, в main не проверяются)

с getline можно было не реализовывать посимвольное чтение самостоятельно

Note: See TracTickets for help on using tickets.