我如何释放这些mallocs?

时间:2016-10-26 03:31:40

标签: c matrix malloc free

我有这个功能来为矩阵分配内存:

double **mmalloc(int r, int c){
    double **matrix = (double **)malloc((r)*sizeof(double*));
    for (int y = 0; y < r; y++){
        matrix[y] = (double *)malloc(c*sizeof(double));
    }

    for (int y = 0; y < r; y++){
        for(int x = 0; x < c; x++){
            matrix[y][x] = 0;
        }
    }
    return matrix;
}

如何释放返回矩阵的所有内存?我有这个函数来释放矩阵......我可以释放矩阵的行但我不能释放列。

这是释放功能:

// Free all memory allocated for A 
void mfree(int r, int c, double **A){
    for (int y = 0; y < r; y++){
        free(A[y]);
    }
}

3 个答案:

答案 0 :(得分:3)

void xfree(int r, int c, double **A){
    for (int y = 0; y < r; y++){
             free(A[y]);  
    }
    free(A)
}

答案 1 :(得分:3)

您需要逐个释放所有行,然后释放最初分配的列(包含所有行)

void xfree(int r, int c, double **A){
    for (int y = 0; y < r; y++){
        free(A[y]);
    }
    free (A);
}

按此顺序。

double ** (Initial allocation)
  ↓
(double *)row0 → col0 col1 ...
(double *)row1 → col0 col1 ...
...

其中每个row i 由(双)列组成。

为了完全释放动态分配的数组数组,请记住这些规则

  • free 的数量必须等于用于分配数组及其数组的 malloc 的数量

  • 考虑如果某些东西 free d它就不再可用了,即使它可能偶然起作用(这种行为之后的行为称为未定义行为)。例如,如果你free(A)首先,你不应该free(A[i]),因为A - 一个包含指针列表的内存空间 - 不应再被分配/使用了。

  • 因此免费首先是最里面的元素(“包含”,例如A[i])然后免费“容器”(例如{{1} })。

答案 2 :(得分:0)

我会欺骗&#39;并为您的数据分配一个连续的块,然后第二个块为您提供对行的数组访问:

int main(){

    int r=3;
    int c=4;

    double* data = malloc(sizeof(double) * r * c);
    double** matrix = malloc(sizeof(double*) * r);

    int i;
    for (i=0;i<r;++i) { /* build the nice syntax accessor */
        matrix[i] = &data[i*c];
    }
    for (i=0;i<(r*c);++i) { /* you can fill/clear the whole matrix in one loop too */
        data[i] = i;
    }    

    // access data through matrix as a normal 2d array
    matrix[2][2] = 1.1;
    int x,y;
    for (x=0;x<r;++x) {
        for (y=0;y<c;++y) {
            printf("[%1.1f]", matrix[x][y]);
        }
        printf("\n");
    }

    // when done
    free(matrix);
    free(data);

    return 0;
}

输出:

[0.0][1.0][2.0][3.0]
[4.0][5.0][6.0][7.0]
[8.0][9.0][1.1][11.0]

我甚至不认为你调用两个frees的顺序(假设你同时执行这两个并且之间没有访问权限),因为一个数组只指向另一个数组 - 你保持对每个数组的单独引用。

你甚至可以将数据和矩阵存储在一个结构或其他东西中,然后有一个函数来获取该结构并释放这两个区域(或两个区域,然后是结构本身)。

注意:这似乎是编译和工作但我不是为了生活而写C,在使用生产代码之前得到第二意见,以防我错过了什么