【问题标题】:Stack Memory "leak" in C [closed]C中的堆栈内存“泄漏”[关闭]
【发布时间】:2015-10-08 21:25:22
【问题描述】:

考虑下面的代码段:

void f() {
    int arr[10];
    arr = malloc(sizeof(int) * 100);
    for (int i = 0 ; i < 100 ; i++) {
        printf("%d ", arr[i]);
    }
    puts("");
    free(arr);
}

函数 f 返回时会释放原来的arr[10] 堆栈内存吗? (或者这是堆栈内存泄漏?)

【问题讨论】:

  • 你不能给数组类型赋值。
  • 如果我没记错的话,我认为这段代码甚至不会编译。你试过了吗?
  • 你已经声明了int arr[10]。如果您使用过int *arr,那么这个问题将是有意义的。
  • 你为什么不试着编译它并观察编译器错误呢?并使用正确的原型样式声明器!
  • 好点 - 它没有编译。

标签: c memory-management memory-leaks


【解决方案1】:

你做不到

 arr = malloc(sizeof(int) * 100);

就像你在你的代码 sn-p 中所做的(试图做)。 arr 是数组类型,不允许赋值。

随后,也许值得一提的是,在非动态分配的指针上调用 free() 会调用 undefined behavior

FWIW,“泄漏”出现在动态内存分配(通常是堆)分配的内存中。对于分配在“堆栈”区域(由编译器)中的变量,不需要从您的程序中管理(用于取消分配或 free -ing)。

【讨论】:

    【解决方案2】:

    int arr[10];该数组已从堆栈中分配; 动态分配数组,将其声明为指针 int *arr;

    动态分配不会被自动释放,使用free或者类似的释放它;

    【讨论】:

      【解决方案3】:

      当您声明数组 arr 时,您已经为它分配了空间(在您的函数堆栈上)。将 malloc 的内存(在堆上分配)分配给该数组是没有意义的。这样做会调用编译错误。您应该使用指针而不是声明该数组。一个指针将为您抓取并存储该 malloc'd 空间。

      【讨论】:

      • 您不会通过将malloced 内存分配给数组来调用未定义的行为。行为定义明确:它会产生编译错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 2013-03-08
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多