首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存分配时内存泄漏

内存分配时内存泄漏
EN

Stack Overflow用户
提问于 2012-08-17 14:27:22
回答 4查看 147关注 0票数 1

我有一个创建2D数组的函数:

代码语言:javascript
复制
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;
}

现在我可以创建一个二维数组:

代码语言:javascript
复制
    float** temp=createMatrix(2,2);

我还有一个函数,例如,转置我的“矩阵”(2D数组):

代码语言:javascript
复制
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;
}

现在,如果我这样做:

代码语言:javascript
复制
temp=matrixTranspose(temp,2,2);

以前分配给temp的旧内存发生了什么?我的transpose函数分配新的内存块。显然,在换位之后,我必须以某种方式释放“旧临时”,但是如何(优雅地)释放呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-17 14:30:00

您的free可以镜像您的分配:

代码语言:javascript
复制
int i;
for(i = 0; i < y; i++)
    free(array[i]);
free(array);

但是,如果您将matrixTranspose创建的新矩阵赋给temp,那么您将丢失指向该内存的指针。所以用另一个指针来跟踪它,或者将matrixTranspose的结果赋给另一个指针:

代码语言:javascript
复制
float **transposedMatrix = matricTranspose(...);

如果您认为您的矩阵是可变的,您还可以将它们转置到适当的位置:不是在matrixTranspose函数中分配新的矩阵,而是在现有数组中移动数字。您可以使用一个float temp就地完成此操作。

票数 3
EN

Stack Overflow用户

发布于 2012-08-17 14:29:51

调用matrixTranspose时,使用另一个变量(指针)。然后,编写一个矩阵的free-ing内存函数。

如下所示:

代码语言:javascript
复制
float** newTemp = matrixTranspose(temp,2,2);
freeMatrix( temp );
temp = newTemp;

否则,您将释放temp所指向的内存,从而导致内存泄漏。

freeMatrix应该与内存分配是对称的:

代码语言:javascript
复制
for(int i=0; i<y; i++)
    free( array[i] );
free( array );
票数 2
EN

Stack Overflow用户

发布于 2012-08-17 14:32:42

你不能这么做。你需要两个变量。

代码语言:javascript
复制
float **tmp2 = matrixTranspose(temp, 2, 2);

并为矩阵编写一个解除分配器函数:

代码语言:javascript
复制
void freeMatrix(float **m, int x) {
    int i;
    for (i = 0; i < x; i++) {
      free(m[i]);
    }
    free(m);
}

,然后才能分配

代码语言:javascript
复制
temp = tmp2;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12000766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档