我有一个创建二维数组的函数:
float** createMatrix(int x, int y){
float** array= malloc(sizeof(float*) * y);
for(int i=0; i<y; i++)
array[i] = malloc(sizeof(float) * x);
return array;
}
现在我可以创建一个二维数组:
float** temp=createMatrix(2,2);
我还有一个函数,例如,它转置我的“矩阵”(二维数组):
float** matrixTranspose(float** m, int x, int y){
float** result=createMatrix(y, x);
for(int i=0; i<y; i++){
for(int j=0;j<x; j++) result[j][i]=m[i][j];
}
return result;
}
现在如果我这样做:
temp=matrixTranspose(temp,2,2);
以前分配给 temp 的旧内存会怎样?我的转置函数分配新的内存块。显然我必须在移调后以某种方式释放“旧温度”,但如何(优雅地)?
最佳答案
您的免费
可以反射(reflect)您的分配:
int i;
for(i = 0; i < y; i++)
free(array[i]);
free(array);
但是,如果您将 matrixTranspose
创建的新矩阵分配给 temp
,那么您将丢失指向该内存的指针。所以用另一个指针跟踪它,或者将 matrixTranspose
的结果分配给另一个指针:
float **transposedMatrix = matricTranspose(...);
如果您认为您的矩阵是可变的,您也可以就地转置它们:不是在 matrixTranspose
函数中分配一个新矩阵,而是移动现有数组中的数字。您可以使用一个 float temp
就地执行此操作。
关于c - 分配内存时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12000766/