释放指针的功能不起作用

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():无效指针:0x00000038ce7b9850 ***

你能帮我指出我做错了什么吗?

在你的代码中。 pointer1 被单元化。它指向 无效 内存。将其传递给 free() 调用 undefined behavior.

引用 C11,章节 §7.22.3.3,(强调我的)

The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if the argument does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to free or realloc, the behavior is undefined.

您需要

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

就是说,pointer2pointer3pointer4 在您的代码中未声明,但可能是错字,所以我们可以忽略它。

您在这些指针上调用 free,但您从未使用 malloc 为它们分配任何内存。事实上,您尝试 free 的指针未初始化,因此它们可以包含任何内容。

当您设置 pointersToClose 的值时,您正在分配 pointer1pointer2 等的 当前 值,不是 "some important code here using the pointers" 运行时它们可能包含的任何值。

free 的指针值传递给 malloc/realloc/calloc 未返回的指针值会导致 undefined behavior.

如果您想这样做,请尝试将每个相关指针的 地址 放入数组中。

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;
}

Could you help me out pointing what I'm doing wrong?

您应该仅在使用 malloc() 函数在堆上分配的指针上使用 free()

会发生什么,在堆(保留内存space)中,您作为参数提供给malloc()函数的长度被分配给您使用,它return是该内存第一个字的地址space,因此可以将其分配给指针。

当您使用 free() 时,它会释放内存 space,以便可以重复使用。

在这里,您创建了不指向任何内容的指针变量(实际上它们指向一个随机值)。因此,当您在这些变量上调用 free() 时发生的事情是您尝试释放一些不在托管 space 内的随机内存 space,称为堆。由于这些地址不太可能由 malloc() 分配,free() 函数不知道如何处理它,因此 return 会出错!

阅读有关 what are the stack and the heap to better understand what those are. Also, read the C programming language book by Kernighan and Ritchie 的内容,其中解释得很好。

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

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;
}