【问题标题】:Should I call free when creating a new pointer pointing to an area originally created by malloc创建指向最初由 malloc 创建的区域的新指针时,我是否应该调用 free
【发布时间】:2018-01-28 04:16:36
【问题描述】:

在下面的代码中,我是否需要“释放”指向使用 malloc 分配的内存区域的指针?释放主指针还不够吗?

char * parentArray = malloc( 10 * sizeof(char));
char * miniArray   = &parentArray [1];
free(myArr);
// free(miniArray) ? 

【问题讨论】:

  • 你分配了一个这样的内存区域,比如说[0, 1, 2, 3, 4],使用mallocMalloc 将返回一个指向分配内存的第一个位置的指针,即*ptr = [0]。即使您可能有 1000 个指针指向 0-4 之间的任何内存区域(已分配),但当您释放内存时,您必须使用已分配区域的第一个地址进行释放。例如,如果你有 10 个指针指向分配的内存区域的第一个地址,那么只有一个 free 就足够了。我希望我能说清楚。
  • 更清楚一点,1 malloc 意味着 1 free,即一对一的“映射”。
  • 什么是myArr?仅供参考:miniArray 指向内存,但不是分配的开始,所以注释掉的 free(miniArray) 会失败。
  • 规则很简单:每次分配只释放一次。

标签: c pointers malloc


【解决方案1】:

在您的代码中,parentArraymalloc 返回的值,这是需要传递给free 的值。 C 中执行动态内存分配的函数系列是:malloccallocrealloc。对这些函数之一未返回的值调用 free 或对同一值调用两次 free 是未定义的行为。

确实存在其他函数,例如 strdup 调用 malloc 并返回结果,因此这些指针也必须被释放。 strdup 的文档会告诉你这一点。一般来说,在编写 C 时,您必须了解谁负责分配和释放内存,并确保此“合同”有据可查。

【讨论】:

  • 感谢您的澄清。这有确切的原因吗​​?可以免费传入的只有这三个函数的产品吗?
  • 是的。这些是您在 C 中分配动态内存的 3 个函数。确实存在其他函数,例如 strdup 调用 malloc 并返回结果,因此这些指针也必须被释放。 strdup 的文档会告诉你这一点。一般来说,在编写 C 时,您必须了解谁负责分配和释放内存,并确保此“合同”有据可查。
  • 您可能需要编辑您的问题并将上面评论中的一些信息移到答案中——以确保它不会被忽略。
【解决方案2】:
char * miniArray   = &parentArray [1];

这里你没有分配内存,而是让miniArray指向某个地址。

因此,miniArray 不需要 free

但是取消引用miniArray 不应该free(parentArray) 之后进行。这会导致未定义的行为,即您不应该这样做

*miniArray

稍后在您的代码中。

【讨论】:

    【解决方案3】:

    free() 释放先前由malloc()calloc()realloc() 分配的空间,否则行为未定义。

    来自 C 标准##7.22.3.3p2

    free 函数导致 ptr 指向的空间被释放,也就是说,可用于进一步分配。如果 ptr 是空指针,则不会发生任何操作。否则,如果参数与内存管理函数先前返回的指针不匹配,或者如果空间已通过调用 free 或 realloc 被释放,则行为未定义。

    在您的代码 sn-p 中,parentArray 使用 malloc() 分配内存 但在这里:

    char * miniArray   = &parentArray [1];
    

    miniArray 指向parentArray 的第一个元素的地址,这是一个有效的内存,但不是malloc() 返回的指针。因此,免费调用miniArray 将是未定义的行为。

    【讨论】:

      【解决方案4】:
      1. parentArray引用malloc()分配的动态内存;您的代码 sn-p 没有其他功能。
      2. malloc()calloc()realloc() 提供的每个分配都应释放一次且仅一次;对同一分配的多个引用只能释放一次。

      一个简单的例子:

      void *a=malloc(size); // a references heap mem allocation
      void *b=a; // b references heap mem allocation
      free(a);   // heap mem allocation freed
      free(b);   // error: heap mem allocation already freed
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多