【问题标题】:Correct allocate and free memory for arrays in C++为 C++ 中的数组正确分配和释放内存
【发布时间】:2011-05-16 22:43:29
【问题描述】:

我正在处理动态数组。函数empty_matrix() 创建一个新数组,表示一个矩阵。 delete_matrix() 释放所有分配给矩阵的内存。

如果我调用add(add(a, b), c),函数example() 是否会出现内存泄漏?在函数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);
} 

【问题讨论】:

  • 您可以使用 valgrind 之类的工具:valgrind.org 可以告诉您是否存在泄漏。

标签: c++ arrays memory-management


【解决方案1】:

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

【讨论】:

  • 使用面向对象我无法避免单独释放add(...) 函数分配的内存? std::vector 和数组一样快吗?如何通过get(int i, int j)访问数据?
  • @multiholle:是的,您将避免内存泄漏,因为临时对象将被销毁,其析构函数将被调用并释放内存。至于如何使用vector请看这个链接:codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4027
  • @multiholle:是的,向量几乎与数组一样快。很少有明显差异的情况。
  • 这个构造函数是什么意思?我不知道“:”后面是什么。 matrix(int dimension) :data_(new element_type[dimension*dimension]) { }
  • @multiholle:称为构造函数初始化列表。看看这个cprogramming.com/tutorial/initialization-lists-c++.html
【解决方案2】:

是的,您必须使用delete_matrix 释放任何empty_matrixadd 调用的结果。您正在泄漏内存,因为您没有释放最里面的 add 调用的矩阵。

【讨论】:

    【解决方案3】:

    您的代码中应该有一个new 对应一个delete 和一个new[] 对应一个delete[]。这是最重要的原则。

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


    另外,empty_matrix 应该是 matrix 类的构造函数,delete_matrix 应该是它的析构函数。

    您还可以将data 替换为std::vector,这样您的内存处理将更加自动化,从而使您无需计算news 和deletes。

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2015-12-17
      • 2012-01-22
      相关资源
      最近更新 更多