Правильное выделение и освобождение памяти для массивов в C ++ - PullRequest
2 голосов
/ 28 ноября 2010

Я имею дело с динамическими массивами.Функция empty_matrix() создает новый массив, представляющий матрицу.delete_matrix() освобождает всю память, выделенную для матрицы.

Получается ли утечка памяти в функции example(), если я вызываю add(add(a, b), c)?Что будет с памятью, выделенной в функции add(...)?Я должен освободить это?Где мне это сделать?

 matrix empty_matrix(int dim) {
 matrix m;
 m.dim = dim;
 m.data = new int*[dim];
 for (int i = 0; i < dim; i++)
  m.data[i] = new int[dim];

 return m;
}

void delete_matrix(matrix m) {
 for (int i = 0; i < dim; i++)
  delete [] m.data[i];
 delete [] m.data;
}

matrix add(matrix a, matrix b) {
 matrix c = empty_matrix(a.dim);
 for (int i = 0; i < a.dim; i++)
  for (int j = 0; j < a.dim; j++)
   c.data[i][j] = a.data[i][j] + b.data[i][j];

 return c;
}

void example() {
 matrix a = empty_matrix(100);
 matrix b = empty_matrix(100);
 matrix c = empty_matrix(100);

 // some modifications of a, b and c
 // ...

 matrix d = add(add(a, b), c);
 print_matrix(d);

 delete_matrix(a);
 delete_matrix(b);
 delete_matrix(c);
 delete_matrix(d);
} 

Ответы [ 3 ]

5 голосов
/ 28 ноября 2010

То, что вы должны сделать, это использовать Ориентацию объекта / RAII.Ваш член данных класса матрицы должен быть закрытым, а память для него должна быть выделена в конструкторе и освобождена в деструкторе.Таким образом, вам не придется беспокоиться об утечках памяти.

Например ...

class matrix
{
public:
      typedef int element_type;
      matrix(int dimension)
          :data_(new element_type[dimension*dimension])
      {

      }  
      //Do define your copy-constructor and assignment operators
      ~matrix()
      {
         delete [] data_;
      } 

private:
      element_type* data_;
};

Это все, конечно, если это домашняя работа.Если это не так, то вам следует воздерживаться от использования массивов в этой ситуации.Используйте std::vector с

2 голосов
/ 28 ноября 2010

Да, вам придется освободить результат любого вызова empty_matrix или add, используя delete_matrix. Вы теряете память, потому что вы не освобождаете матрицу самого внутреннего add вызова.

1 голос
/ 28 ноября 2010

В вашем коде должно быть ровно одно new для одного delete и одно new[] для одного delete[].Это самый важный принцип.

Следовательно, если функция add создает новую матрицу, ее необходимо где-то удалить.


Кроме того, empty_matrix должен быть конструкторомкласса matrix, и delete_matrix должен быть его деструктором.

Вы также можете заменить data на std::vector, и ваша обработка памяти будет гораздо более автоматизированной, избавляя вас от необходимостиподсчета new с и delete с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...