2012-08-17 68 views
1

当泄漏我有它创建一个二维数组的函数:存储器分配存储器

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的旧内存会发生什么?我的转置功能分配新的内存块。很显然,我不得不以某种方式在换位后释放“旧温度”,但是如何(优雅地)呢?

回答

3

free可以反映你的配置:

int i; 
for(i = 0; i < y; i++) 
    free(array[i]); 
free(array); 

但如果分配给tempmatrixTranspose创建新的矩阵,那么你”会失去你指向那个内存的指针。因此,跟踪与另一个指针,或matrixTranspose结果分配给另一个指针:

float **transposedMatrix = matricTranspose(...); 

如果你认为你的矩阵,可变的,你也可以调换他们在的地方:而不是分配在一个新的矩阵matrixTranspose函数,你移动现有数组中的数字。您可以使用一个float temp来完成此操作。

+0

是的,这听起来很明显。我只是想我可能会以某种方式避免需要临时指针。听起来像你不能。感谢你们所有人,但自从你们第一次以来,我会接受你的回答。 – 2012-08-17 06:35:32

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); 
+0

如果我将一个新数组分配给“newTemp”,会发生什么? “温度”也会改变(我想不)?另外,我需要在此之后释放“newTemp”,否则它只是坐在那里无所事事地吃东西? – 2012-08-17 06:38:26

+0

如果在'temp = newTemp;'之后将新的arrey赋值给'newTemp',这将不会影响由'temp'指向的数组。你只需要2个数组和两个指针,每个指针一个。你需要'释放'所有的阵列,你不需要了。否则,他们只会吃掉你的记忆。而且一旦你丢失了所有分配的内存的指针,它就不能再被释放了。 – 2012-08-17 06:46:14

+0

谢谢我现在明白了。 – 2012-08-17 06:49:58

1

你不这样做。你需要两个变量。

float **tmp2 = matrixTranspose(temp, 2, 2); 

,写一个释放器功能矩阵:

void freeMatrix(float **m, int x) { 
    int i; 
    for (i = 0; i < x; i++) { 
     free(m[i]); 
    } 
    free(m); 
} 

你可以分配

temp = tmp2; 
0
int FreeMatrix(char **matrix, int x, int y) { 
    int i; 
    for(i=0; i<y; i++) { 
    free(matrix[i]); 
    } 
    free(matrix); 
} 

不那么优雅的部分,在这里是,你必须跟踪分配的范围。处理这个问题有多种方式,大部分涉及跟踪它们,例如,通过包装malloc和免费。 Google for'malloc free multidimensional arrays'。