繁体   English   中英

释放指针的函数不起作用

[英]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的值时,您分配的是pointer1pointer2等的当前值,而不是“此处使用指针的一些重要代码”运行时它们可能包含的任何值。

将指针值传递给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是空指针,则不会发生任何操作。 否则,如果参数与之前由内存管理函数返回的指针不匹配,或者如果空间已通过调用freerealloc释放,则行为未定义。

你需要要么

  • 将其设置为NULLnull-pointer常量)
  • 首先使用malloc()或 family 分配free内存。

也就是说, pointer2pointer3pointer4在您的代码中未声明,但这可能是一个错字,因此我们可以忽略它。

为了释放一个指针,你必须首先为它分配内存。 您将释放从未分配过的指针。 尝试以下代码以了解您做错了什么

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM