我有这个矩阵的构造函数来分配内存
class Matrix
{
public:
int** matrix;
int cols;
int rows;
};
Matrix::Matrix(int row, int col)
{
cols = col;
rows = row;
matrix = new int*[rows];
int i;
for (i = 0; i < rows; ++i)
{
matrix[i] = new int[cols];
}
}
现在我想重载operator =,但我无法弄清楚如何编写函数并分配新内存,而不会出现内存泄漏或内存不足。
我在这个矩阵上做了=,已经为它分配了内存,那么我可以删除内存并使用另一个内存大小创建新内存吗?
现在我在operator =
上有这个this->rows = other.rows;
this->cols = other.cols;
int i, j;
for (i = 0; i < this->rows; ++i)
{
for (j = 0; j < this->cols; j++)
{
this->matrix[i][j] = other.matrix[i][j];
}
}
return *this;
答案 0 :(得分:5)
惯用的方法是使用复制/交换习语。见What is the copy-and-swap idiom?
然后将作业简化为
Matrix& operator=(Matrix copy){
swap(*this, copy);
return *this;
}
使用此习语查看您获得的所有津贴的链接问题。
答案 1 :(得分:3)
我建议从手动分配数组切换到使用std::vector
class Matrix
{
public:
Matrix(int row, int col);
int cols;
int rows;
std::vector<std::vector<int>> matrix;
};
Matrix::Matrix(int row, int col)
: cols(col),
rows(row),
matrix(rows, std::vector<int>(cols))
{ }
现在你可以让编译器生成你的拷贝赋值运算符,以及其他构造函数,析构函数等。这个类现在是可复制的,可移动的,并且不会泄漏内存,因为matrix
现在使用RAII语义而不是你必须管理它的记忆。
答案 2 :(得分:0)
首先,您可以使用delete运算符重新分配每列。
foo
然后你可以释放指向每一行的指针。
for (i = 0; i < rows; ++i)
{
delete []matrix[i];
}
之后,您可以根据需要从作为参数传递的新矩阵中分配新矩阵。