нужно в первую очередь думать о "владении", то есть о том, кто в программе управляет чьим временем жизни. Если вернуться к нашим баранам, то есть классу Matrix, нужно решить, сам ли класс выделяет себе память для работы, и отвечает за неё (т.е. владеет), или только использует объекты, которые ему передают снаружи. Если задача объекта класса - получить указатель и предоставить какой-то удобный интерфейс к лежащим по нему данным, то пользовательский деструктор не нужен, при деинициализации делать просто нечего. Если же Matrix сам хранит в себе данные, и не зависит ни от каких внешних источников (кроме момента инициализации, когда эти данные ему передают, конечно), то он должен при создании сначала выделить память и скопировать туда информацию, а при уничтожении - очищать память. Извиниясюь, что сложно, не очень умею на пальцах объяснять концепции
Я сейчас заметил, что мой деструктор перестаёт работать только при вызове функций сравнения, умножения матриц и сложения матриц. Что не так с этими функциями, можешь пожалуйста взглянуть https://pastebin.com/uKjNjayW
тебе как минимум нужен конструктор копирования
Matrix::~Matrix() { for (int i = 0; i < rows; i++) { delete[] arr[i]; } } Тут одно удаление, а выделений в конструкторе два
Да, я уже вернул delete[] arr; После цикла, но ошибка не только в этом
string Matrix::sumMatrix(Matrix _matrix) Передача по значению. Конструктора копирования нет. Следовательно, нет семантики разделения владением ресурсами выделенной памяти. Любая передача по значению сотрёт оба объекта - передаваемый, и получаемый.
Это уже не говоря о том, что хорошо бы большие объекты передавать по ссылке...
string Matrix::multiplyMatrix(Matrix _matrix) string Matrix::sumMatrix(Matrix _matrix) Почему результат умножения матриц - вдруго строка? Почему аргументы не const ?
Спасибо большое, передача по ссылке решила проблему
НЕТ! не решила, а скрыла! Проблема никуда не делась!
const препод запретил использовать. Строка, потому что препод хочет чтоб пользователь увидел предупреждение, если действие с матрицами сделать нельзя
Предупреждения делаются исключениями, а не строками.
А что с const не так, что препод запретил?
А про CONST - я уверен, что ты что-то не так понял.
Чтоб решить проблему, нужно использовать конструктор копирования?
И вот что это за порно? string Matrix::determinant() string Matrix::sumMatrix(Matrix _matrix) string Matrix::multiplyMatrix(Matrix _matrix) int** Matrix::multiplyByNum(int n) Все операции неправильные. У всех какая-то идиотская семантика, судя по сингнатурам. Переделывай. Ошибки надо возвращать через исключения. Все методы, не меняющие данные , должны быть константными. Каждый метод для векторной операции должен возвращать другую матрицу, по значению. (для этого надо определять конструктор копирования и оператор присваивания) А скалярные операции должны возвращать тот же тип, что и элемент матрицы. Матрицы целых практически бесполезны, надо либо делать float/double , либо делать шаблон с шаблонным параметром-типом вместо int
string Matrix::determinant() { /// // temporary array for storing row int* temp = new int[rows + 1]; Где освобождение ?
Оно разве не удаляется после завершения функции?
Matrix::Matrix(int r_count, int c_count, int num...) Это что за п..... — не заметил сразу .... Это вообще лютый пиздец, если не умеешь с элипсисом работать — не берись, Да и без него надо было бы делать, а от initializer list
Какой класс памяти у temp ?
Это лучше удалить?
да, конечно.
Это просто ацкий угар...
Обсуждают сегодня