Почему деструктор вызывается лишний раз? Реализую класс матриц и прегружаю операторы для работы с ним, только начал, получаю ошибку
Error in `./matrix': free(): invalid pointer: 0xбла-бла-бла далее прикрепляю код, вываливается программа после вызова оператора=. Помогите неучу пожалуйста)matrix.cpp/* matrix.cpp
*
* Lab 5. Класс «Матрица». Разработать класс,
* реализовать основные операции,
* например «+, -, *, T», с помощью перегрузки операций.
*
* Автор: Александр Овчинников
*/
#include "matrix_class.h"
#include
using namespace std;
int main(){
//construct & assign
Matrix l_mtx(3,3);
l_mtx[2][2] = 5.525;
l_mtx.printMatrix();
cout r_mtx(3,3);
r_mtx[2][2] = 9;
r_mtx.printMatrix();
cout result(3,3);
result = (l_mtx + r_mtx);
result.printMatrix();
return 0;
}
и сам заголочныйmatrix_class.h#ifndef MATRIX_CLASS_H
#define MATRIX_CLASS_H
#include
using namespace std;
template
class Matrix
{
private:
int row;
int column;
type **data;
public:
int getRow()
{
return row;
}
int getColumn()
{
return column;
}
void printMatrix()
{
for (int i = 0; i row ?
{
for (int j = 0; j row = row;
this->column = column;
data = new type* [row];
for (int i = 0; i r_mtx)
{
if (row == r_mtx.getRow())
{
if (column == r_mtx.getColumn())
{
for (int i = 0; i operator +(Matrix r_mtx)
{
if (row == r_mtx.getRow())
{
if (column == r_mtx.getColumn())
{
Matrix res(row, column);
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < column; ++j)
{
res[i][j] = data[i][j] + r_mtx[i][j];
}
}
return res;
}
}
cout << "Sum error: matrix are not equal!" << endl;
exit(EXIT_FAILURE);
}
};
#endif // MATRIX_CLASS_H
выходит так
0 0 0
0 0 0
0 0 5.525
0 0 0
0 0 0
0 0 9
I'm dying... 0x1c6b1b0
I'm dying... 0x1c6b1d0
I'm dying... 0x1c6b1f0
I'm died! 0x1c6b190
*** Error in `./matrix': free(): invalid pointer: 0x0000000001c6b1e0 ***
Aborted

21 Авг 2019 в 07:09
175 +1
0
Ответы
1

Проблема здесь заключается в том, что при перегрузке оператора присваивания operator=, вы создаете новый объект Matrix<type> r_mtx в качестве параметра. Поскольку это новый объект, он создается с собственными массивами данных и при вызове деструктора для этого r_mtx объекта, он также освобождает память для этих массивов данных. Таким образом, при освобождении памяти для данных r_mtx, деструктор освобождает память для тех же указателей данных, что и ваш первоначальный объект, что приводит к ошибке free(): invalid pointer.

Чтобы избежать этой проблемы, вы можете изменить свой оператор присваивания, чтобы он принимал const ссылку на объект Matrix вместо создания его копии. Это позволит вам избежать освобождения памяти для исходного объекта при вызове деструктора для параметра.

Вот каким образом можно изменить ваш оператор присваивания:

void operator =(const Matrix<type>& r_mtx)
{
if (row == r_mtx.getRow())
{
if (column == r_mtx.getColumn())
{
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < column; ++j)
{
data[i][j] = r_mtx[i][j];
}
}
}
else
{
cout << "Assign error: matrix column are not equal!" << endl;
exit(EXIT_FAILURE);
}
}
else
{
cout << "Assign error: matrix rows are not equal!" << endl;
exit(EXIT_FAILURE);
}
}

Теперь при вызове оператора присваивания operator=, вы будете передавать константную ссылку на объект r_mtx, и не будете создавать копию, что избавит вас от ошибки.

20 Апр в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 749 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир