2015-08-24 5 views
0

У меня есть этот конструктор для матрицы для выделения памятиутечка памяти перегрузки оператора =

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]; 
    } 
} 

теперь я хочу, чтобы перегрузить оператор =, но я не могу понять, как написать функцию и выделить новый память, не получая утечки памяти, или не имея достаточной памяти.

Матрица, на которой я сделаю = на ней, уже выделена память, поэтому я могу удалить память и создать новую память по размеру другой?

сейчас у меня есть это на оператора =

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

У вас есть конструктор копирования? –

+0

Да, я сделал конструктор копирования – Mumfordwiz

ответ

5

Идиоматическим способом является использование идиомы копирования/замены. См What is the copy-and-swap idiom?

Отнесение затем восстанавливают до

Matrix& operator=(Matrix copy){ 
    swap(*this, copy); 
    return *this; 
} 

Смотрите связанный вопрос для всех льгот вы получаете, используя эту идиому.

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 вместо того, чтобы управлять своей памятью.

0

Сначала вы можете перераспределить каждый столбец с помощью оператора delete.

for (i = 0; i < rows; ++i) 
    { 
      delete []matrix[i]; 
    } 

Затем вы можете освободить указатели для каждой строки.

delete []matrix; 

После этого вы можете выделить новую матрицу по мере необходимости из аргумента, переданного в качестве аргумента.

Смежные вопросы