在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),就像我一样?或者是我无法解决的问题(垫子)?
答案 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