【问题标题】:C malloc() memory space released after program ends? [duplicate]程序结束后释放C malloc() 内存空间? [复制]
【发布时间】:2012-01-25 15:08:55
【问题描述】:

可能重复:
What REALLY happens when you don't free after malloc?
Is freeing allocated memory needed when exiting a program in C

在我的第一个 C 课程中,我被告知我应该在 malloc()calloc() 之后调用 free(),因为它会在动态分配内存后释放空间,否则它将消失(我假设直到系统重新启动)。但是,最近我开始在各种编码站点上阅读,这些内存将在程序结束时释放回来。

哪一个是正确的说法?

我会查看官方规范,但我不知道从哪里获得它(尝试谷歌搜索)。

谢谢。

【问题讨论】:

  • 所有与程序相关的内存在终止时被释放。 (如果你创造了僵尸,它们会一直存在)
  • 后者有时可能是正确的,但前者是一个非常好的经验法则。
  • @cHao:是的,可能还有很多其他人。这个问题被问了很多。

标签: c malloc free


【解决方案1】:

真的很简短的答案..

这两种说法都是正确的。


更长更精致的..

它们都是正确的,当您的应用程序完全终止时,分配的内存将(可能)被释放回系统。

我写的是“可能”,因为所有现代/广泛使用的操作系统都会释放所使用的内存,但一些原始系统可能没有这个“功能”可用。

由于上述原因,您应该始终使用free 来释放已分配但未使用的变量的内存,尤其是在运行时(否则您将发生内存泄漏,可能/将慢慢耗尽所有可用内存)。

如果你想在应用程序终止前不释放内存,我和大多数人都可以。但是,请确保你要运行应用程序的平台确实释放了内存之后返回操作系统。


关于查看标准(“官方规范”)

该标准最常/总是忽略实现细节,因此其中没有说明当正在运行的应用程序终止时尚未释放的已分配内存会发生什么。

这是特定于实现的,因此取决于您正在运行它的/on/at 什么。

【讨论】:

    【解决方案2】:

    这是有效的在程序内,即在进程运行时

    除此之外,这取决于操作系统。没有规范,但绝大多数系统会在进程完成后清理进程使用的所有内存。

    【讨论】:

      【解决方案3】:

      给定进程的所有内存都会在其终止时释放回系统。但是,在程序退出之前,始终free() 您的内存很重要,尤其是对于长时间运行的程序。在短期运行的程序中,这仍然是一种很好的做法。当valgrind 吐出一份干净的健康单时总是很好!

      【讨论】:

        【解决方案4】:

        在任何具有受保护内存的系统上(例如 Windows 4.x+、Linux、Unix 等),当程序终止时,内存会被释放。

        然而,一些嵌入式系统可能总是这样做。

        不管怎样,free() 一切都正确肯定是一种很好的形式。

        【讨论】:

          猜你喜欢
          • 2010-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-08
          • 2012-10-04
          • 1970-01-01
          • 2018-09-01
          • 2015-09-10
          相关资源
          最近更新 更多