Хорошо, проблема, вероятно, в том, что вы не показывали операторы копирования / перемещения.
Как только у вас есть необработанный указатель, содержащий динамическую память, вы должны реализовать конструкторы копирования и перемещения, а также операторы копирования и перемещения назначения.или явно удалите их, потому что их неявно определенная версия не может правильно обработать это.
Так что это может быть приемлемо (я говорю приемлемо, не хорошо, потому что, если вы не реализуете универсальный контейнер, вы должны избегать необработанного динамического выделения памятии полагаться только на стандартные контейнеры):
#include <iostream>
namespace Math {
class Matrix {
public:
int row;
int col;
double *mat; // beware rule of 3/5
Matrix(int row, int col, double *mat);
~Matrix();
Matrix(const Matrix&) = delete; // explicitely delete what we don't define
Matrix(Matrix&&) = delete;
Matrix operator = (const Matrix&) = delete;
Matrix operator = (Matrix&&) = delete;
};
}
Math::Matrix::Matrix(int row, int col, double * mat)
{
this->mat = new double[(this->row = row) * (this->col = col)];
for (int i = 0; i < row * col; i++) {
this->mat[i] = mat[i];
}
}
Math::Matrix::~Matrix()
{
if (this->mat != nullptr)
{
delete[] this->mat;
}
}
std::ostream & operator<<(std::ostream & os, const Math::Matrix & m)
{
for (int i = 0; i < m.row; i++)
{
for (int j = 0; j < m.col; j++)
{
os << m.mat[i*m.col + j] << ' ';
}
os << '\n';
}
return os;
}
int main(){
double *m = new double[6]{1,2,3,4,5,6}; // store the automatic memory pointer ...
Math::Matrix mat(2, 3, m); // only uses the direct ctor
delete[] m; // to be able to delete it!
std::cout << mat;
return 0;
}
Но когда вы пишете:
A = Math::Matrix(2, 3, new double[6]{ 1, 2, 3, 4, 5, 6 });
- , вы сначала выделяете память для массива из 6 двойных, которые никогда не будут освобождены с тех порвы не перемещаете указатель -> утечка памяти гарантируется
- , тогда вы почти правильно строите временную матрицу
- , которую вы назначаете для уже существующего объекта ...
Оператор перемещения по умолчанию копирует элемент mat
из темпаПопробуйте матрицу A, и тогда временная матрица будет уничтожена, освобождая указатель памяти на mat
member -> висячий указатель, гарантированный
Этот висячий указатель является причиной неопределенного поведения и странных выходных данных.
Кстати, моя версия с удаленными операторами присваивания вызовет ошибку компиляции в этой строке, что является предупреждением красного света: остерегайтесь, что-то скоро сломается около этой точки ...
TL / DR: если выможете избежать прямого управления выделенной памятью, а если вы не можете этого избежать, то реализуйте конструкторы копирования / перемещения и операторы присваивания или явно удалите те, которые вы не определили.