【问题标题】:How would I free these mallocs?我将如何释放这些 malloc?
【发布时间】:2017-03-08 06:52:27
【问题描述】:

我有这个函数来为矩阵分配内存:

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]);
    }
}

【问题讨论】:

标签: c matrix malloc free


【解决方案1】:

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

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 ...
...

每个rowi 由(双)列组成。

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

  • frees 的数量必须等于用于分配数组及其数组的 mallocs 数量

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

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

【讨论】:

    【解决方案2】:
    void xfree(int r, int c, double **A){
        for (int y = 0; y < r; y++){
                 free(A[y]);  
        }
        free(A)
    }
    

    【讨论】:

    • 我同意,我使用了 ringø 的建议
    • 我很抱歉这个错误。我在编写代码时牢记 A 是 3D 指针,但 A 是 2D 指针。我已经更新了我的答案。
    【解决方案3】:

    我会“作弊”,然后为您的数据分配一个连续的块,然后为您分配第二个块,让您可以通过数组访问您的行:

    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]
    

    我认为你调用这两个 free 的顺序并不重要(前提是你两者都做并且在两者之间没有访问权限),因为一个数组只是指向另一个数组 - 你维护对每个数组的单独引用。

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

    注意:这似乎可以编译和工作,但我不是以编写 C 为生的,在用于生产代码之前获得第二意见,以防我遗漏了什么

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 2021-08-29
      • 2012-02-07
      • 1970-01-01
      相关资源
      最近更新 更多