c - 分配内存时内存泄漏

标签 c memory-management memory-leaks dynamic-arrays

我有一个创建二维数组的函数:

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/

相关文章:

c - 我想要更大的 pixbuf 渲染到 GtkSource Gutter

c - 使用 GDB 找出我的程序在哪里挂起?

有关 Instruments 工具的 iOS 问题、我的应用程序中的内存问题

c# - 这是内存泄漏还是正常行为?

iphone - 了解内存泄漏检查工具 - iPhone

c++ - 监视 C++ OpenFrameworks 应用程序,是否有卡住或内存泄漏,然后强制退出并重新启动?

c - 多维线性数组 C

c - 使用OpenMP计算PI值

objective-c - 检索视频 ram 使用 iphone

c - 'pre' - 分配指针但尚未使用是什么意思?