从C中的函数中释放二维指针数组

时间:2015-01-06 22:01:19

标签: c pointers memory free

在C中,我有以下创建2D数组的功能。

int** createMatrix(int xdim, int ydim){
        int** mat = malloc(xdim*sizeof(int*));

        int i;
        for(i=0; i<xdim; i++){
                mat[i] = malloc(ydim*sizeof(int));
        }

        return mat;
}

在调用函数中(在这种情况下为int main()):

int **matA = createMatrix(10, 10);
free(matA);

我似乎有一个释放内存的问题,我想知道这是否因为变量“mat”永远不会被释放。

是否足以免费(matA),就像我一样?或者是我无法解决的问题(垫子)?

4 个答案:

答案 0 :(得分:5)

您需要先单独释放每一行(基本上是您创建的相反过程)

for(i=0; i < xdim; i++)
     free(matA[i]);

free(matA)

我建议您创建一个freeMat函数来执行此操作

答案 1 :(得分:2)

释放指针实际上意味着您释放它指向另一个分配的内存。所以,是的,释放matA将释放您分配的内存块,但您需要释放mat的每个已分配元素。

for(int i = 0; i < xdim; i++)
    free(matA[i]);
free(matA);

答案 2 :(得分:0)

仅免费matA是不够的。 matA引用了xdim的{​​{1}}指针的存储空间,但每个指针都引用了自己独立的存储块。如果以这种方式分配数组数组,则必须释放外部数组,但也必须(首先)释放每个内部数组。

答案 3 :(得分:0)

当您释放先前为变量分配的内存(例如ptr)时,您将失去对它的访问权限。 free函数不会更改ptr的值,因此它仍然指向同一位置(现在无效)。

对于数组,在释放指向该元素的变量的内存之前,必须逐行遍历数组以释放您已分配的每个元素。这里的所有用户都会告诉您相同的内容。

如果您首先释放[xdim]之一,则您将无法访问所有[ydim] 内存泄漏 )它指着。换句话说,你无法释放它们。您机器上的操作系统可以自动释放它(但不能保证),但控制释放内存的过程是一个很好的做法:

[ X ]---[ydim]--[ydim]-[ydim] 
[ X ]---[ydim]--[ydim]-[ydim]
[ X ]---[ydim]--[ydim]-[ydim]

因此,免费元素不是更好“#34;负责&#34;对于其他元素。就你而言,它是[ydim]。首先释放这些元素,你不会丢失其他元素,[xdim]。然后你可以通过[xdims]并释放它们:

// freed `[ydim]` of the first `[xdim]`
[xdim]---[ X ]--[ X ]-[ X ] 
[xdim]---[ X ]--[ X ]-[ X ]
[xdim]---[ X ]--[ X ]-[ X ]

// now you can free all `[xdim]`
[ X ]
[ X ]
[ X ]    

// the `matA` array has been freed