[英]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.