[英]Function to free pointers not working
我正在学习 C 并试图找出一种优雅的方法来在执行结束时释放我的指针。
经过几个小时的调试和使用以下代码试验不同的东西后,我无法弄清楚我做错了什么:
int ClosePointers(char *pointersToClose[], int arraySize) {
int index;
for(index = 0; index < arraySize; index++) {
char *pointer = pointersToClose[index];
free(pointer);
}
return (0);
}
int main(int argc, char *argv[]) {
char *pointersToClose[4];
char *pointer1;
char *pointer2;
char *pointer3;
char *pointer4;
pointersToClose[0] = pointer1;
pointersToClose[1] = pointer2;
pointersToClose[2] = pointer3;
pointersToClose[3] = pointer4;
pointer1 = malloc(10);
pointer2 = malloc(10);
pointer3 = malloc(10);
pointer4 = malloc(10);
/*some important code here using the pointers*/
ClosePointers(pointersToClose, 4);
return 0;
}
我收到以下错误: * glibc 检测 * /home/workspace/Debug/Test-POC: free(): invalid pointer: 0x00000038ce7b9850 ***
你能帮我指出我做错了什么吗?
您在这些指针上调用free
,但您从未使用malloc
为它们分配任何内存。 实际上,您尝试free
的指针未初始化,因此它们可以包含任何内容。
当您设置pointersToClose
的值时,您分配的是pointer1
、 pointer2
等的当前值,而不是“此处使用指针的一些重要代码”运行时它们可能包含的任何值。
将指针值传递给malloc
/ realloc
/ calloc
未返回的free
会导致未定义的行为。
如果你想这样做,试着把每个有问题的指针的地址放在你的数组中。
int ClosePointers(char **pointersToClose[], int arraySize) {
int index;
for(index = 0; index < arraySize; index++) {
char **pointer = pointersToClose[index];
free(*pointer);
}
return (0);
}
int main(int argc, char *argv[]) {
char **pointersToClose[4];
char *pointer1;
char *pointer2;
char *pointer3;
char *pointer4;
pointersToClose[0] = &pointer1;
pointersToClose[1] = &pointer2;
pointersToClose[2] = &pointer3;
pointersToClose[3] = &pointer4;
/*some important code here using the pointers*/
ClosePointers(pointersToClose, 4);
return 0;
}
你能帮我指出我做错了什么吗?
您应该只在使用malloc()
函数在堆上分配的指针上使用free()
。
发生的情况是,在堆(保留的内存空间)中,分配给malloc()
函数的参数长度供您使用,并将地址返回到该内存空间的第一个字,因此可以分配给一个指针。
当您使用free()
,它会释放该内存空间以便可以重用。
在这里,您创建了不指向任何内容的指针变量(实际上它们指向一个随机值)。 因此,当您对这些变量调用free()
时发生的情况是您尝试释放一些不在托管空间内的随机内存空间,称为堆。 由于这些地址不太可能由malloc()
分配,因此free()
函数无法知道如何处理它,因此将返回错误!
继续阅读堆栈和堆是什么,以更好地理解它们是什么。 另外,请阅读Kernighan 和 Ritchie 所著的C 编程语言书,其中解释得很好。
在你的代码中。 指针pointer1
被单元化。 它指向无效的内存。 将其传递给free()
调用未定义的行为。
引用C11
,第 7.22.3.3 章,(强调我的)
free
函数导致ptr
指向的空间被释放,即可供进一步分配。 如果ptr
是空指针,则不会发生任何操作。 否则,如果参数与之前由内存管理函数返回的指针不匹配,或者如果空间已通过调用free
或realloc
释放,则行为未定义。
你需要要么
NULL
( null-pointer
常量)malloc()
或 family 分配free
内存。 也就是说, pointer2
、 pointer3
和pointer4
在您的代码中未声明,但这可能是一个错字,因此我们可以忽略它。
为了释放一个指针,你必须首先为它分配内存。 您将释放从未分配过的指针。 尝试以下代码以了解您做错了什么
int AllocatePointers(char *pointersToClose[], int arraySize) {
int index;
for(index = 0; index < arraySize; index++) {
pointersToClose[index] = malloc(50*sizeof(char));
}
return (0);
}
int main(int argc, char *argv[]) {
char *pointersToClose[4];
char *pointer1;
char *pointer2;
char *pointer3;
char *pointer4;
pointersToClose[0] = pointer1;
pointersToClose[1] = pointer2;
pointersToClose[2] = pointer3;
pointersToClose[3] = pointer4;
AllocatePointers(pointersToClose, 4);
/*some important code here using the pointers*/
ClosePointers(pointersToClose, 4);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.