【问题标题】:How do I free up memory allocated implicitly in an array?如何释放在数组中隐式分配的内存?
【发布时间】:2021-03-02 04:46:51
【问题描述】:

对于 C 中的动态内存分配,您必须先释放(或释放)保留的内存,然后才能执行和编译程序。例如:

....
... = malloc(...)
...
free(...)
return 0;

但是如果我不使用动态内存分配它是如何工作的。例如,如果我使用int array [10000000] 保留了 40000000 字节的空间,那么我以后不需要时如何在程序中释放内存?

【问题讨论】:

  • 如果分配为函数的本地数组,当您从函数返回时,它会自动释放。否则,你不能。
  • @WeatherVane,不完全是。它不是free d,因为没有为它分配堆空间。它的内存在堆栈上,free 无法管理。更准确的说法是它的内存被自动“释放”了。
  • 这就是我编辑评论的原因,而不是说freed。
  • 好的,只有在您返回时才会释放内存。但是,当您不再需要它时,即在您将其用于预期目的之后,是否没有办法释放内存?
  • @SkiMask 是的。您可以在有限范围内定义它,并且在该范围结束时将其释放。如果您需要对对象的生命周期进行更多控制,也可以只使用动态内存分配。

标签: c memory memory-management malloc dynamic-memory-allocation


【解决方案1】:

对于 C 中的动态内存分配,您必须先释放(或释放)保留的内存,然后才能执行和编译程序。

这……很困惑。动态内存只存在于运行时——它与编译或执行程序无关。当你不再需要它时,你 free 内存在正在运行的程序中

至于没有使用*alloc分配的东西...

如果您在函数体中定义int array[10000000]; 并且没有 static 关键字,那么array 具有自动存储持续时间;进入函数时为它保留内存,退出时释放1, 2。如果您在文件范围内、在任何函数的主体之外定义数组,或者如果您使用 static 关键字声明它,则 array 具有 静态存储持续时间,并且将为它保留内存程序启动时,程序退出时释放。


  1. 官方说,只有当你进入该变量的封闭范围时才能保证内存被保留——也就是说,如果你在for循环体中定义数组,那么内存只保证在该循环期间可用。但是,实际上,大多数编译器会在函数入口处为所有局部变量分配空间,并在函数退出时释放空间。
  2. 请注意,当您运行程序时, 较大的数组可能会导致运行时错误 - 单个函数中局部变量的存储相对有限。

【讨论】:

    【解决方案2】:

    之所以称为动态内存是有原因的:它可以在需要时动态分配/释放。

    如果动态内存的对立面是……不是动态的,那也是有原因的:像你提到的那样的静态数组不能被释放。

    你需要的是变量生命周期的概念:

    • 如果int array [10000000]是一个全局变量,它的生命周期就是程序的整个生命周期
    • 如果int array [10000000] 位于用花括号{ } 括起来的块中,则它会存储在堆栈中,一旦执行退出块,它的生命就结束了
    • 如果在块中使用 static 关键字 (static int array [10000000];) 声明变量,则它的生命周期是整个程序的生命周期,尽管它的 范围 仅限于块

    【讨论】:

      【解决方案3】:

      在 C 中有多种分配内存的方法。

      • 自动存储持续时间(也称为局部变量)- 在进入块时自动分配(函数、if 语句、循环或其他),并在退出块时释放。
      • 静态存储持续时间(也称为全局变量和static 局部变量)- 在程序开始时自动分配,并在结束时自动释放。
      • 动态存储持续时间(也称为堆) - 使用 malloc 分配并使用 free 释放。

      顺便说一句,您不必在退出程序之前释放所有东西。操作系统将在退出时释放属于您的程序的所有内存。 (否则您必须更频繁地重新启动计算机)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-02
        • 1970-01-01
        • 2013-01-27
        • 1970-01-01
        • 1970-01-01
        • 2017-02-02
        • 2020-11-09
        • 1970-01-01
        相关资源
        最近更新 更多