簡體   English   中英

遞歸中的C ++內存泄漏

[英]C++ memory leak in recursion

我正在嘗試實現一種在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來使程序正確處理釋放。 這些很可能是一旦矩陣mulmult完成后就會泄漏的變量,您將失去再次引用它們的能力。 您可以很容易地釋放此內存,因為在您的代碼中所有內容的大小均為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 *));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM