【问题标题】:How to free memory on stack mid-function call如何在堆栈中间函数调用中释放内存
【发布时间】:2016-02-07 05:00:33
【问题描述】:

假设我有一个数组 arr[10],然后我将所有元素复制到另一个数组 arr2[20]。我不再需要 arr,所以我执行 arr=arr2 将其指针移动到新数组。 arr[10] 使用的内存是否仍在使用,还是自动释放?如果还在使用,有没有办法让我在重新分配指针之前释放它?

【问题讨论】:

  • 您需要发布代码,因为您描述的内容是不可能的(即先有 arr[10],然后是 arr=arr2)。
  • 感谢 Jim,我现在意识到了这一点。你知道如何将一个数组变量重新分配给另一个数组吗?
  • 使用指针。您可以将指针分配给arr,然后根据您要执行的操作将其指向arr2
  • 但是,无论如何,正如其他答案所说,除非您确定数组的使用范围,否则您不能在函数结束之前释放堆栈内存,但即使 then 也没有保证,因为编译器可以为所欲为。
  • 太棒了!多谢;这真的很有帮助。我对数组不是指针有点困惑。

标签: c memory-management


【解决方案1】:

如果您像int arr[10]; 一样声明了arr,那么它将存储在stack 上,并在函数结束时被释放。您通常不能释放堆栈内存中间函数。

如果您使用malloc() 定义它,那么它将在堆上,您必须使用free() 来释放它。否则它将是内存泄漏并在程序退出后被释放。但是,即使您遇到内存泄漏,您的计算机也将始终能够检索该内存,因为 virtual memory

【讨论】:

    【解决方案2】:

    arr[10] 使用的内存还在使用,还是自动释放?

    这取决于您实际声明数组的方式。

    • 如果将其声明为自动变量,则函数调用结束时会自动释放它。
    • 如果你做一些动态分配,那么它会在函数调用结束后存在,你必须手动释放它。

    【讨论】:

      猜你喜欢
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 2012-09-17
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多