我正在写一门矩阵课(大学作业)。重载运算符,一切正常,但由于某种原因 tmp2 在添加操作期间被删除
矩阵类字段(3个)
unsigned int m, n;//строка, столбец
float** matrix;
运算符重载:
FloatMatrix operator + (FloatMatrix m2)
{
unsigned int maxM, maxN, minM,minN;
if (this->m > m2.m) {
maxM = this->m;
minM = m2.m;
}
else
{
maxM = m2.m;
minM = this->m;
}
if (this->n > m2.n) {
maxN = this->n;
minN = m2.n;
}
else
{
maxN = m2.n;
minN = this->n;
}
// Создать новую матрицу максимальной размерности и в нее класть результат
FloatMatrix res = FloatMatrix(maxM, maxN);
for (unsigned int i = 0; i < this->m; i++)
{
for (unsigned int j = 0; j < this->n; j++)
res.matrix[i][j] = this->matrix[i][j];
}
for (unsigned int i = 0; i < m2.m; i++)
{
for (unsigned int j = 0; j < m2.n; j++)
res.matrix[i][j] += m2.matrix[i][j];
}
return FloatMatrix(res.m,res.n, res.matrix);
}
程序本身的代码:
FloatMatrix tmp = FloatMatrix(2, 5);//матрица 2*5
FloatMatrix tmp2 = FloatMatrix(2);//Матрица 2*2
tmp.FillFloat(2.0);
tmp2.FillFloat(3.0);
tmp1.Print();//Без проблем
tmp2.Print();//без проблем
FloatMatrix tmp3 = tmp + tmp2;
tmp1.Print();//без проблем
tmp3.Print();//без проблем
tmp2.Print();//Исключение
说明:如果您尝试显示 tmp 和 tmp3,则没有问题。当您尝试输出 tmp2 时,m,n 字段是否等于 2(应该如此)?但是你不能访问 tmp2.matrix[0][0] (我只是写了完整的路径,它是如何尝试访问的,我知道它不能从外部访问,我通过内部的 Print() 方法访问它)。原来 tmp2.matrix[i] 指针已被清除。错误代码:Необработанное исключение по адресу 0x002538A8 в Matrix.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xDDDDDDDD.
我猜没有深拷贝拷贝构造函数。结果,因为有
按值传递,复制完成
tmp2,现在 2 个指针指向同一个内存。求和完成后,副本被删除,指针tmp2指向已释放的内存。好吧,在析构函数中,已经释放的那个被释放了......
那么,我对复制构造函数是否正确?...