【发布时间】:2011-05-15 18:24:56
【问题描述】:
我正在编写一个 C 应用程序,我使用 malloc 在堆上创建数据。现在,当应用程序处于活动状态时,这些数据始终是持久的,所以我从不“释放” Malloc 数据。
我的问题是:这个内存会在应用程序终止时自动释放,还是我必须在应用程序完成时手动执行 free()?
【问题讨论】:
我正在编写一个 C 应用程序,我使用 malloc 在堆上创建数据。现在,当应用程序处于活动状态时,这些数据始终是持久的,所以我从不“释放” Malloc 数据。
我的问题是:这个内存会在应用程序终止时自动释放,还是我必须在应用程序完成时手动执行 free()?
【问题讨论】:
这是实现定义的。严格遵循 C 标准,您应该在应用程序终止之前 free malloc'd 的所有内容。
但是,任何现代通用操作系统都会在您之后进行清理,因此这只适用于某些嵌入式、老式或其他特殊环境。
作为一种风格,请尝试free 每个分配的块。它让您养成编写干净代码和防止内存泄漏的习惯。
【讨论】:
free,因为它们每个用户只有一个地址空间。
它将被释放。这就是“过程”抽象的奇妙之处。此正在运行的进程所拥有的所有资源和内存在终止时都会被释放。
请注意,提出这种抽象需要一些时间,但它是一个非常好的系统沙箱。事实上,杀死进程甚至被用作最后的手段来尝试修复在执行数天时出现泄漏或性能下降的错误程序(它被称为"Process Rejuvenation",甚至存在于会议和期刊中,但实际上是承认糟糕的设计或编码)。
【讨论】:
你永远不应该明确地free 这样的内存。充其量它不会给您带来任何好处,而最坏的情况它会将大量换出的数据交换回内存,只是为了检查一些簿记指针,然后将其丢弃,从而无缘无故地破坏用户的硬盘驱动器。
【讨论】:
free() 它们(这通常甚至不会将内存返回给操作系统!)可能是一项耗时的忙碌工作。
free() s。
mmap() 获得一大块,跟踪高水位标记,并且只允许您使用整个批次中的单个munmap() 来释放它。这样的分配器可能在库代码中很有用。