Проблема здесь заключается в том, что при перегрузке оператора присваивания 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, и не будете создавать копию, что избавит вас от ошибки.
Проблема здесь заключается в том, что при перегрузке оператора присваивания 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, и не будете создавать копию, что избавит вас от ошибки.