[英]Free array of pointers
我有这个测试代码:
void test2(){
char** twoDArray = (char**)calloc(3,sizeof(char*));
char* element1 = (char*)calloc(3,sizeof(char));
twoDArray[0] = element1;
twoDArray[1] = element1;
twoDArray[2] = element1;
freeArray(twoDArray,3);
}
void freeArray(char** arr,int size){
if(arr!= NULL){
for(int i =0 ;i < size;i++){
if(arr[i] != NULL){
free(arr[i]);
arr[i] = NULL;
}
}
free(arr);
arr = NULL;
}
}
在freeArray
arr[1] != NULL
中循环的第二次迭代中arr[1] != NULL
给出'true'并发生错误,为什么? 如何正确释放这样的数组?
您正在为数组的每个元素分配完全相同的指针。 我不知道您为什么/如何期望它工作(因为那样您将没有类似2D的数组,因为设置一行的一个元素也会更改所有其他行中同一列的元素... )
如果您仍然坚持这种设计,那么应该只释放一次内部“数组” 。
但是我怀疑您想模拟一个理智,有效,明智的 2D阵列。 在这种情况下,您有两个选择:
I. hackish解决方案:与您的解决方案几乎相同,但是您需要在单独的步骤中为每一行calloc
内存,如下所示:
twoDArray[0] = calloc(3, sizeof(twoDArray[0]));
twoDArray[1] = calloc(3, sizeof(twoDArray[0]));
twoDArray[2] = calloc(3, sizeof(twoDArray[0]));
(或者使用循环...如果您知道它们是什么。)
二。 正确的解决方案:为什么不分配连续的内存块,并避免对calloc()
所有多余调用,以及什么时候需要free()
d而感到头疼? 一数组->一分配,一解除分配:
char (*arr[3]) = calloc(3, sizeof(arr[0]));
// ...
free(arr);
美观,简单且易于维护。
如果要使用freeArray
函数,则必须定义一些有关数组必须包含什么的规则。 您对freeArray
实现假定了数组的每个元素都指向一个单独分配的字符数组,但是该数组的每个元素实际上都指向了相同的字符数组,因此您最终尝试释放多个相同的数组次,这是无效的。
如果freeArray
的假设是正确的,那么您将需要修改创建数组的方式。 如果freeArray
的假设不正确,则需要修改freeArray
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.