递归中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来使程序正确处理自由。这些很可能是泄漏的变量,因为一旦 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 *));
相关文章:
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存