【问题标题】:C - malloc and automatic storageC - malloc 和自动存储
【发布时间】:2017-11-16 00:47:18
【问题描述】:

我知道在函数中声明的变量有automatic storage。这是否意味着不需要使用malloc 在函数调用中显式分配的free 指针(下面的p)?

void f() {
  int *p;

  p = malloc(sizeof(int));
  *p = 1;
  printf("%p %d\n", p, *p);  // 0x7fc135c02850 1
  free(p);                   // is this necessary?
}

int main() {
  f();
}

(请注意,我在这里使用了指向 int 的指针,但该问题适用于任何返回值为 malloc 和朋友的指针。)

我猜不是,因为malloc 在堆而不是堆栈上分配内存;因此,当f() 的堆栈帧被弹出时,p 指向的内存不会被自动释放。

【问题讨论】:

  • 您正在释放变量包含的指针指向的内存,而不是变量。
  • 谢谢,编辑了问题;如果您有更好的建议,请告诉我。

标签: c pointers memory-management


【解决方案1】:

p本身是自动存储,功能结束后会消失。然而它指向的东西在某些时候确实需要是free()'d。例如,您可以从函数中返回 malloc()'d 内存,稍后 free() 它 - p 仍然消失了

【讨论】:

  • 你能再解释一下你的最后一句话吗?
  • 你的函数可以(理论上)做return p;(只要返回类型匹配)。然后,只要你在调用它时存储结果——例如int *r = f();——你可以在稍后free内存——free (r);——尽管p本身不再存在。
  • 我用这个作为接受的答案,而不是stackoverflow.com/a/47319825/2419669,因为这是第一个到达的。但两者在内容上是一样的。
【解决方案2】:

您使用malloc() 分配的内存必须是free()'d。在您的情况下,自动存储适用于变量 p 本身,但不适用于您分配的内存!当你使用free(p) 时,你释放了内存p 指向 而不是p 变量本身

【讨论】:

  • f() 出栈后,p 指向的内存区域是否可以free f()
  • 当然!正如史蒂夫解释的那样,如果你返回你的指针p,你可以稍后free()它,因为它是在堆中分配的,而不是在堆栈中。当您退出 malloc()'d 所在的函数范围时,malloc()'d 内存不会自动 free()'d。
【解决方案3】:

正确,需要致电free

【讨论】:

    【解决方案4】:

    如果您要求手动分配内存,则必须手动释放您要求的空间。所以免费是必要的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-20
      • 2011-05-09
      • 2012-03-09
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      相关资源
      最近更新 更多