递归时C ++内存泄漏

时间:2014-12-31 12:38:37

标签: c++ recursion memory-leaks

我正在尝试在C ++(O(logn))中实现对矩阵应用幂运算的快速方法。因此,我可以定义乘法和幂运算,如下所示

int ** matrixmul(int ** A, int ** B, int n) {
    int ** result = (int **) calloc(sizeof(int *), n);
    for (int i = 0; i < n; ++i)
    result[i] = (int *) calloc(sizeof(int), n);

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            int sum = 0;
            for (int k = 0; k < n; ++k) {
                sum += A[i][k] * B[k][j];
            }
            result[i][j] = sum;
        }
    }
    return result;
}

int ** matrixpow(int ** m, int n, int p) {
    if (p == 1) {
        return m;
    } else if (p % 2 == 0) {
        return matrixmul(matrixpow(m, n, p / 2), matrixpow(m, n, p / 2), n);
    } else {
        return matrixmul(matrixmul(matrixpow(m, n, (p - 1) / 2), matrixpow(m, n, (p - 1) / 2), n), m, n);
    }
}

matrixmul函数不是矩阵的通用乘法,它只适用于平方乘法。

我的问题是,是否有一种修改这些函数的方法,所以我不会有任何内存泄漏,因为程序在每次递归调用时都会丢失内存

2 个答案:

答案 0 :(得分:4)

用向量替换**,避免使用calloc,malloc,new和delete。

std::vector< std::vector<int> > result = ....

这将消除内存管理问题,您可以在C ++ 11中按值返回向量。

typedef std::vector< std::vector<int> >  Matrix;

Matrix  matrixmul(const Matrix& A, const Matrix& B, int n) {
  Matrix result(n);
  for (int i = 0; i < n; ++i)
    result[i] = std::vector<int>(n);

  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      int sum = 0;
      for (int k = 0; k < n; ++k) {
        sum += A[i][k] * B[k][j];
      }
     result[i][j] = sum;
    }
  }
  return result;
}

答案 1 :(得分:1)

如果由于某种原因想要继续使用int**,还可以在将结果返回到matrixmult之前释放A和B,从而使程序正常处理。这些变量很可能是一旦完成矩阵结构就会泄露的变量,你将失去再次引用它们的能力。你可以很容易地释放这个内存,因为整个代码中的所有内容都是n:

for( int i = 0 ; i < n ; i++ ) {
    for( int j = 0 ; j < n ; j++ ) {
        free(A[i][j]);
        free(B[i][j]);
    }
    free(A[i]);
    free(B[i]);
}

这行代码似乎很奇怪:

int ** result = (int **) calloc(sizeof(int *), n);

calloc的第一个参数应该是你想要的元素数量,第二个应该是size。我相信它应该是

int ** result = (int **) calloc(n, sizeof(int *));