вылазит ошибка "Unhandled exception: Stack cookie instrumentation code detected a stack-based buffer overrun."?
Код только конструкторов и деструкторов: https://pastebin.com/ae0j1hDh
Весь код: https://pastebin.com/2bpJ2cvN
class Matrix { public: ... int** arr; Matrix(); Matrix(int r_count, int c_count, int num...); Matrix(int** _arr, int r_count, int c_count); ~Matrix(); string sumMatrix(Matrix _matrix); string multiplyMatrix(Matrix _matrix); ... bool isEqual(Matrix _matrix); };
конструктор берёт указатель на любые данные (даже если они не созданы через new[], например, это массив на стеке), а деструктор норовит их обязательно удалить через delete[]. Независимо от того, в этом ошибка, или нет, так делать нельзя. Если класс выделил память - пусть сам и чистит, если не выделял - очистка - не его обязанность. Это(гуглить про идиому RAII) очень важный принцип, который нужно соблюдать. Короче, правильный Matrix должен либо копировать себе содержимое массива, который ему дали в конструкторе, либо забирать только при условии, что владельцем становится только он. Если с move-семантикой вы пока ещё не знакомы - лучше всегда безусловно копировать любые входные данные.
Я в конструкторе присваиваю arr то что передано через конструктор, разве это не копирование? Просто код не работает только когда деструктор существует, если я его комментирую, то все функции выполняются, но конструктор по любому нужен и я не понимаю как его починить
если речь о конструкторе Matrix::Matrix(int** _arr, int r_count, int c_count) - то точно нет. Там копируется _указатель_, а не данные, на которые он указывает.
Обсуждают сегодня