[英]freeing memory to a 2d array in C
因此,我使用以下逻辑创建了动态尺寸的2d数组:
int **newBoard;
newBoard = (int **) malloc(sizeof(int *) * rows);
newBoard[0] = (int *) malloc(sizeof(int) * cols * rows);
for (i = 0; i < rows; i++) {
newBoard[i] = (*newBoard + cols * i);
}
但是现在我无法释放分配的内存。 每当我尝试接收“ free():无效的指针:0x00000000007343c8 ***”错误消息时。 我目前正在尝试释放内存,例如:
for (i = 0; i < rows; i++) {
free(newBoard[i]);
}
free(newBoard);
谁能帮助我,告诉我如何正确释放它?
当你做
newBoard[0] = (int *) malloc(sizeof(int) * cols * rows);
您正在为int
对象的cols * rows
空间分配连续的内存块。 您只能使用块的开始释放一次, 不能在内存开始的偏移量释放它,也不能多次释放它, 只能释放一次 。
for (i = 0; i < rows; i++) {
newBoard[i] = (*newBoard + cols * i);
}
在这里, newBoard[i]
获得的是连续内存块的偏移量,因此您不能在不同的偏移量处释放一次以上,而必须在该块的开始处释放一次 。
free(newBoard[0]);
free(newBoard);
是正确的。
请不要malloc
,这是不好的做法。 并且您应该检查malloc
返回NULL
。
我个人认为这是只执行2个malloc
而不是row+1
malloc
的聪明方法,但是它也有缺点。 您必须非常小心。 释放不需要的单个内存块是不可能的,单个newBoard[i]
重新分配也是不可能的。 为了避免像多个free
这样的错误,您必须要有很多纪律,这就是为什么我认为传统的总体做法更好。 我会做:
for(i = 0; i < rows; ++i)
newBoard[i] = malloc(cols * sizeof *newBoard[i]);
那么您可以像以前一样自由。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.