【问题标题】:Should I free memory in C if it is not allocated properly?如果没有正确分配,我应该在 C 中释放内存吗?
【发布时间】:2021-05-30 05:13:23
【问题描述】:

当例如声明一个 malloc 然后检查它是否为 NULL 以查看它是否已正确分配时,如果它为 null,我是否应该释放内存,例如:

int *p;
p = (int *)malloc(sizeof(int)); 
  
    if (p == NULL)
    {
        free(p); //Should I free here or will it create an error?
        return NULL;
    }    

【问题讨论】:

  • 只是一个旁注:在p == NULL ... free(p);free(NULL); 是等价的(C 通过值传递参数)并且表现良好(它们什么都不做)的情况下。

标签: c memory dynamic-memory-allocation


【解决方案1】:

如果malloc 返回一个空指针,它根本就没有分配任何东西,也没有什么可以释放的。

话虽如此,将空指针传递给free 什么都不做,所以它是安全的。

在相关的注释中,在 C 中你不应该真的 cast the result of malloc

【讨论】:

    【解决方案2】:

    如果没有正确分配,我应该在 C 中释放内存吗?

    你不应该,因为你做不到,因为事实证明这个问题甚至没有意义。

    malloc 要么给你一个正确分配内存的指针,要么不给你。
    这两种情况是不同的:它要么给你一个非空指针,要么给你一个空指针。
    空指针返回意味着malloc 失败,并且没有为您分配任何内存。

    假设在尝试但未能分配您要求的内存的过程中,malloc 确实部分分配了一些内存,或其他东西。假设释放它是你的工作。你会怎么做?你没有办法提及那段记忆!当malloc 失败时,它会返回一个空指针,而空指针根据定义指向任何地方。

    将空指针传递给free 函数没有多大意义。曾几何时,这是一个错误,并且往往会崩溃。今天,它是无害的:free 检查你是否给了它一个空指针,如果是,它什么也不做。

    所以事实上,如果malloc 部分分配内存或其他什么,然后失败,则必须是malloc 的工作在将空指针返回给您之前自动清理它。

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 2021-04-21
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 2015-12-17
      • 2012-01-22
      相关资源
      最近更新 更多