#cpp #динамические_массивы
Пишу свой класс математических матриц, храню все в double**. Все работало нормально,
пока не решил заняться деструктором. Теперь при вызове какого либо оператора или функции
мне вылетает исключение: "Ошибка доступа к чтению". Я уже понял из-за чего она вылетает.
Вот мой типичный код:
Matrix Matrix::operator+ (Matrix M)
{
Matrix Temp(Rows, Columns);
for (unsigned i(0); i < Rows; i++)
for (unsigned j(0); j < Columns; j++)
Temp[i][j] = M[i][j] + Element[i][j];
return Temp;
}
Когда он возвращает Temp, он уничтожает все элементы, и Temp не доходит до конца.
Вот деструктор:
Matrix::~Matrix()
{
for (unsigned i(0); i < Rows; i++)
delete[] Element[i];
delete[] Element;
}
Подскажите как мне правильно сделать деструктор.
Ответы
Ответ 1
Вы забыли написать реализовать правильный конструктор копирования, так как конструктор копирования по умолчанию просто копирует указатели. И когда у вас будет два объекта, которые ссылаются на одну и ту же область памяти и у них обоих вызовется деструктор, то он попытается дважды освободить одну и ту же память. Пример кода по правилу copy-and-swap idiom: class Matrix { public: Matrix(size_t rows = 0, size_t columns = 0) : rows_(rows), columns_(columns), pMat(rows || columns ? new double[rows * columns] : nullptr) {} Matrix(Matrix const & obj) : rows_(obj.rows_), columns_(obj.columns_), pMat(obj.rows_ || obj.columns_ ? new double[obj.rows_ * obj.columns_] : nullptr) { std::copy(obj.pMat, obj.pMat + obj.rows_ * obj.columns_, pMat); } Matrix(Matrix&& obj) noexcept : Matrix() { swap(*this, obj); } ~Matrix() { delete[] pMat; } friend void swap(Matrix& first, Matrix& second) { using std::swap; swap(first.rows_, second.rows_); swap(first.columns_, second.columns_); swap(first.pMat, second.pMat); } Matrix const & operator= (Matrix obj) { swap(*this, obj); return *this; } private: double** pMat; size_t rows_; size_t columns_; };
Комментариев нет:
Отправить комментарий