#c #class #dynamic #overloading #operator-keyword
#c #класс #динамический #перегрузка #operator-ключевое слово
Вопрос:
Я пишу некоторый код для самостоятельного изучения C .
Выполняет ли следующий код:
#include <iostream>
using namespace std;
class Matrix
{
int m, n;
public:
float** value;
Matrix(int m, int n)
{
value = new float*[m];
for (int i = 0; i < m; i)
value[i] = new float[n];
this->m = m; this->n = n;
}
~Matrix()
{
for (int i = 0; i < m; i)
delete[] value[i];
delete[] value;
}
Matrix(const Matrixamp; A)
{
m = A.getLength();
n = A.getWidth();
value = new float*[m];
for (int i = 0; i < m; i)
value[i] = new float[n];
for (int i = 0; i < m; i)
for (int j = 0; j < n; j)
value[i][j] = A.value[i][j];
}
int getLength(void) const
{
return m;
}
int getWidth(void) const
{
return n;
}
void print() const
{
for (int i = 0; i < m; i)
{
for (int j = 0; j < n; j)
cout << value[i][j] << "t";
cout << endl;
}
}
Matrix operator (const Matrixamp; B)
{
if (m != B.getLength() || n != B.getWidth())
return Matrix(0, 0);
Matrix C = Matrix(m, n);
cout << value << endl;
for (int i = 0; i < m; i)
for (int j = 0; j < n; j)
C.value[i][j] = value[i][j] B.value[i][j];
return C;
}
void operator = (const Matrixamp; A)
{
m = A.getLength();
n = A.getWidth();
value = new float*[m];
for (int i = 0; i < m; i)
value[i] = new float[n];
for (int i = 0; i < m; i)
for (int j = 0; j < n; j)
value[i][j] = A.value[i][j];
}
};
int main()
{
Matrix A = Matrix(3, 3);
A.value[0][0] = 1; A.value[0][1] = 2; A.value[0][2] = 3;
A.value[1][0] = 4; A.value[1][1] = 5; A.value[1][2] = 6;
A.value[2][0] = 7; A.value[2][1] = 8; A.value[2][2] = 9;
Matrix B = Matrix (3, 3);
B.value[0][0] = 1; B.value[0][1] = 2; B.value[0][2] = 3;
B.value[1][0] = 4; B.value[1][1] = 5; B.value[1][2] = 6;
B.value[2][0] = 7; B.value[2][1] = 8; B.value[2][2] = 9;
Matrix C = A B;
cout << C.value << endl;
C.print();
return 0;
}
Генерировать утечку памяти в части «Матрица C = A B»? Я не знаю, уничтожается ли возвращенная матрица после завершения объединения. Если да, есть ли способ это исправить?
Комментарии:
1. У вас нет утечки
Matrix C = A B;
, но ваш оператор присваивания сломан, так что это могло бы привести к утечке:Matrix C(1,2); C = A B;
Ответ №1:
В инструкции
Matrix C = A B;
утечки нет.
Хотя в вашем коде оператор присваивания копирования не используется, тем не менее, ваш оператор присваивания копирования не освобождает память, ранее выделенную для матрицы объекта. Оператор присваивания копирования отличается от конструктора копирования тем, что объект уже создан и имеет выделенную матрицу. Также вы должны проверить, существует ли самоназначение.
Также это должно быть объявлено как
Matrix amp; operator = (const Matrixamp; A)
Что касается operator
, то оно должно быть объявлено как
Matrix operator (const Matrixamp; B) const;
или как
const Matrix operator (const Matrixamp; B) const;
Комментарии:
1. Что касается оператора присваивания, почему D = C = A B просто не копирует указатель на значение, поскольку тогда я буду возвращать ссылку на * этот объект?
2. @user3422072 A B создает временный объект, который будет удален. Таким образом, вы не можете просто скопировать значение указателя. Память, на которую указывает пользователь, будет удалена, когда временный объект, в свою очередь, будет удален.