我有一个创建2D数组的函数:
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;
}
现在我可以创建一个2D数组:
float** temp=createMatrix(2,2);
我也有一个功能,例如,它转换我的“矩阵”(2D数组):
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的旧内存会发生什么?我的转置函数分配新的内存块。显然,我必须以某种方式在转置之后释放“老临时”,但是如何(优雅地)?
答案 0 :(得分:3)
您的free
可以反映您的分配:
int i;
for(i = 0; i < y; i++)
free(array[i]);
free(array);
但是如果你将temp
分配给由matrixTranspose
创建的新矩阵,那么你将丢失指向该内存的指针。因此,使用另一个指针跟踪它,或将matrixTranspose
的结果分配给另一个指针:
float **transposedMatrix = matricTranspose(...);
如果您认为矩阵是可变的,您也可以将它们转换到位:不是在matrixTranspose
函数中分配新矩阵,而是移动现有数组中的数字。您可以使用一个float temp
来完成此操作。
答案 1 :(得分:2)
调用matrixTranspose
时使用另一个变量(指针)。然后,为free
- 矩阵的内存写一个函数。
像这样:
float** newTemp = matrixTranspose(temp,2,2);
freeMatrix( temp );
temp = newTemp;
否则,你会松开由temp
指向的内存,从而导致内存泄漏。
freeMatrix
应与分配内存对称:
for(int i=0; i<y; i++)
free( array[i] );
free( array );
答案 2 :(得分:1)
你不这样做。你需要两个变量。
float **tmp2 = matrixTranspose(temp, 2, 2);
并为矩阵编写deallocator函数:
void freeMatrix(float **m, int x) {
int i;
for (i = 0; i < x; i++) {
free(m[i]);
}
free(m);
}
和只有您可以指定
temp = tmp2;
答案 3 :(得分:0)
int FreeMatrix(char **matrix, int x, int y) {
int i;
for(i=0; i<y; i++) {
free(matrix[i]);
}
free(matrix);
}
这里不那么优雅的部分是你必须跟踪分配的范围。有多种方法可以解决这个问题,大多数方法都需要跟踪它们,例如:通过包装malloc和免费。谷歌的'malloc免费多维数组'。