Opened 4 years ago
Closed 4 years ago
#763 closed ожидается проверка (задача сдана)
WW #14
Reported by: | Filippov Denis | Owned by: | Sokolov Viacheslav |
---|---|---|---|
Component: | WW_exceptions | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (7)
comment:1 Changed 4 years ago by
Owner: | changed from Sokolov Viacheslav to Filippov Denis |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:2 Changed 4 years ago by
Owner: | changed from Filippov Denis to Sokolov Viacheslav |
---|---|
Type: | ожидаются исправления → ожидается проверка |
comment:3 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:4 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:5 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
10 Matrix(int64_t rows = 0, int64_t cols = 0);
лучше explicit, чтобы Matrix(NULL) не сконструировать случайно
27 std::strncpy(_message, message.begin(), std::max(message.size(), size_t(MAX_MESSAGE_SIZE)));
здесь std::max ломает весь смысл strncpy, нужно просто MAX_MESSAGE_SIZE (константу можно сразу сделать size_t)
If count is reached before the entire string src was copied, the resulting character array is not null-terminated.
для вывода же c-строка должна быть 0-терминированной
registerNumber
имя класса выбивается по стилю от других имен классов
всегда выставляйте .exceptions на failbit, badbit для стандартных потоков ввода/вывода, если не считаете их ожидаемыми
28 /* I understand that this is "megacostyl", but I don't know
29 * how I can avoid copying of code from not const operator().
30 */
Никак. Точнее есть еще более ужасный способ сделать это на шаблонах, но уж лучше копировать.
Тем не менее const_cast - тоже плохое решение. Лучше продублировать код: вынести исключение в отдельную функцию validate..., а вызов validate + обращение по индексу продублировать.
Непонятно, зачем использовать 64 бита для индексации и размерностей.
comment:6 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
comment:7 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
какая мотивация делать инициализацию в заголовочном файле?
==13655== Memcheck, a memory error detector
==13655== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==13655== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==13655== Command: /home/nicesap/HSE/svn/filippov.denis/lab_14/lab_14
==13655== Parent PID: 13654
==13655==
==13655== Conditional jump or move depends on uninitialised value(s)
==13655== at 0x4C32D08: strlen (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13655== by 0x4F687B9: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==13655== by 0x10C33F: main (in /home/nicesap/HSE/svn/filippov.denis/lab_14/lab_14)
==13655==
==13655==
==13655== HEAP SUMMARY:
==13655== in use at exit: 0 bytes in 0 blocks
==13655== total heap usage: 11 allocs, 11 frees, 91,434 bytes allocated
==13655==
==13655== All heap blocks were freed -- no leaks are possible
==13655==
==13655== For counts of detected and suppressed errors, rerun with: -v
==13655== Use --track-origins=yes to see where uninitialised values come from
==13655== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
39 MatrixException?(const std::string &what_arg) noexcept;
explicit
по Стандарту int может быть 16-битным
стоит сделать что-нибудь вроде
и использовать его, чтобы не дублировать код и явно выразить намерение
в данном случае нужен strncpy
Вообще же сигнатура
MatrixException::MatrixException?(const std::string &what_arg)
избыточна - конструируется от const char*, что приведет к лишнему копированию памяти.
Используйте std::string_view
Непонятна мотивация check_status: есть .exceptions(), который бросит исключение (которое можно перехватить в main и вывести сообщение)