递归中C++内存泄漏

C++ memory leak in recursion

本文关键字:泄漏 内存 C++ 递归      更新时间:2023-10-16

我正在尝试实现一种在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 函数不是矩阵的通用乘法,它仅适用于平方矩阵。

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

将 ** 替换为向量,避免使用 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;
}

如果你出于某种原因想继续使用该int**,你也可以通过在矩阵mult返回结果之前释放A和B来使程序正确处理自由。这些很可能是泄漏的变量,因为一旦 matrixmult 完成,您将失去再次引用它们的能力。您可以非常轻松地释放此内存,因为整个代码中的所有内容都是 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 的第一个参数应该是你想要的元素数,第二个参数应该是大小。我相信应该是

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