在C ++中为数组正确分配和释放内存

时间:2010-11-28 18:36:40

标签: c++ arrays memory-management

我正在处理动态数组。函数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 个答案:

答案 0 :(得分:5)

应该做的是使用面向对象/ 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 s

答案 1 :(得分:2)

是的,您必须使用empty_matrix释放任何adddelete_matrix来电的结果。你正在泄露记忆,因为你没有释放最内层add电话的矩阵。

答案 2 :(得分:1)

您的代码中只有一个new deletenew[]一个delete[]。这是最重要的原则。

因此,如果函数add创建了一个新矩阵,则需要在某处删除它。


此外,empty_matrix应该是matrix类的构造函数,而delete_matrix应该是它的destuctor。

您还可以将data替换为std::vector,并且您的内存处理将更加自动化,从而使您免于计算newdelete s的必要性