Странное поведение деструктора класса в C++
Пишу класс для матриц(задание в универе). Перегрузил оператор, все работает, но почему-то 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.
Ответы (1 шт):
Предполагаю, что конструктора копирования с глубоким копированием нет. В результате, из-за того, что тут
FloatMatrix operator + (FloatMatrix m2)
передача по значению, выполняется копирование tmp2, и теперь на одну и ту же память указывают 2 указателя. После завершения суммирования копия удаляется, и указатели в tmp2 указывают на уже освобожденную память.
Ну, а в деструкторе выполняется освобождение уже освобожденного...
Ну так что, я прав насчет копирующего конструктора?...