【问题标题】:C - If realloc is used is free necessary?C - 如果使用 realloc 是免费的吗?
【发布时间】:2011-03-24 23:11:39
【问题描述】:

使用 realloc 时内存会自动释放吗?或者是否有必要将 free 与 realloc 一起使用?以下哪项是正确的?

//Situation A
ptr1 = realloc(ptr1, 3 * sizeof(int));

//Situation B
ptr1 = realloc(ptr2, 3 * sizeof(int));
free(ptr1);
ptr1 = ptr2;

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    都不对。 realloc() 可以返回一个指向新分配内存的指针,或者在出错时返回 NULL。你应该做的是检查返回值:

    ptr1 = realloc(ptr2, 3 * sizeof(int));
    if (!ptr1) {
        /* Do something here to handle the failure */
        /* ptr2 is still pointing to allocated memory, so you may need to free(ptr2) here */
    }
    
    /* Success! ptr1 is now pointing to allocated memory and ptr2 was deallocated already */
    free(ptr1);
    

    【讨论】:

      【解决方案2】:

      ptr1 = realloc(ptr2, 3 * sizeof(int)); 之后的 ptr2 无效,不应使用。您只需释放ptr1。在某些 情况下,realloc 的返回值将与您传入的值相同。

      您可以放心地将ptr1=realloc(ptr2, ... 视为等同于:

      ptr1 = malloc(...);
      memcpy(ptr1, ptr2, ...);
      free(ptr2);
      

      这是大多数情况下发生的情况,除非新大小仍然适合旧内存块 - 然后 realloc 可以返回原始内存块。

      与其他分配函数一样,realloc 如果失败则返回 NULL - 您可能需要检查一下。

      【讨论】:

      • "ptr2 无效,不应使用" - 除非返回空指针,在这种情况下 ptr2 仍然有效并且最终仍需要释放。所以在等价代码中,第二行和第三行都只有if (ptr1)
      【解决方案3】:

      realloc() 自动释放原始内存,或者如果您将realloc() 缩小到较小的大小或有未分配的内存可用于简单地扩展原始分配,则将其原封不动地返回(元数据除外)。

      【讨论】:

        【解决方案4】:

        根据http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/realloc如果重新分配成功则返回新的内存块,否则保留原来的内存块。标准用法如下所示:

        ptr2 = realloc(ptr1, new_size);
        if (ptr2 == NULL) {
           //ptr1 still contains pointer to original array
        } else {
           //ptr2 contains new array, ptr1 is invalid
        }
        

        【讨论】:

        • 您提供的描述不符合标准规定的行为:realloc 失败时返回 NULL。
        • 我试图通过编辑来修复它,不想删除所写的内容。您知道如何在此处删除不需要的文字吗?
        • 只是删除错误。编辑的目的是改进答案。如果有人认为 pmg 的评论与他们看到的答案不符,他们可以查看修订历史记录。
        【解决方案5】:

        在这两种情况下,ptr1 都必须被释放。

        情况 B 更复杂,因为 ptr2 可能指向已释放的空间。或不。这取决于它是否可以重新分配。在 B 中 realloc 之后不应该使用 ptr2。

        【讨论】:

          猜你喜欢
          • 2017-02-25
          • 1970-01-01
          • 1970-01-01
          • 2020-12-23
          • 1970-01-01
          • 2023-04-06
          • 2021-07-22
          • 1970-01-01
          • 2018-09-11
          相关资源
          最近更新 更多