我有两个相关的问题,因此我在这个线程中问它们。
问题 1)如何确认我的操作系统是否在程序终止时自动清除未"空闲"的内存(使用 malloc 分配)?我正在使用 Ubuntu 11.04,32 位和 gcc-4.5.2
根据Steven Summit的教程页面,"释放未使用的内存(malloc'ed)是一个好主意,但这不是强制性的。当程序退出时,应自动释放已分配但未释放的任何内存。如果您的计算机只是因为程序忘记释放内存而以某种方式'丢失'内存,则表明您的操作系统存在问题或缺陷。
问题 2)假设 foo.c malloc 一个 B 字节内存。稍后,foo.c 释放此 B 字节内存位置并将其返回到操作系统。 现在我的问题是,这些特定的 B 字节内存位置是否可以在当前实例中重新分配给 foo.c(由操作系统),或者这些 B 字节不能分配给 foo.c,直到其当前实例终止?
编辑:我建议所有阅读我问题的人在这里和这里阅读类似问题的答案。这两个答案都详细解释了 malloc() 和 free() 的交互和工作,而没有使用非常深奥的术语。要了解内核使用的内存管理工具(例如brk(),mmap())和C编译器使用的内存管理工具(例如malloc(),free())之间的区别,这是必须阅读的。
当进程通过终止信号结束时,例如 SIGSEGV
,或者通过 _exit(2) 系统调用(恰好在从main
返回时也被调用),所有的进程资源都由内核释放。特别是,进程地址空间,包括堆内存(分配有 mmap(2)(或可能sbrk(2)
)系统调用(由malloc
库函数使用)被释放。
当然,free
库函数要么(通常)通过将来对malloc
的进一步调用使释放的内存区域可重用,要么(偶尔,对于大内存区域)使用例如 munmap(2)
系统调用。
要了解有关进程 1234 的内存映射的更多信息,请按顺序读取/proc/1234/maps
伪文件(或从进程内部读取/proc/self/maps
)。/proc 文件系统是查询内核进程的首选方法。(还有/proc/self/statm
和/proc/self/smaps
以及许多其他有趣的事情)。
free
和malloc
的详细行为取决于实现。您应该将malloc
视为获取堆内存的一种方式,free
将其视为一种说以前malloc
-ed 区域无用的方法,并且系统(即标准 C 库 + 内核)可以对它做任何它想做的事情。
使用 valgrind 来搜寻内存泄漏错误。您也可以考虑使用Boehm的保守垃圾收集器,即使用GC_malloc
而不是malloc
,并且不要为释放手动内存而烦恼。
大多数现代操作系统都会回收分配的内存,因此您不必担心。
操作系统不了解您的应用程序/程序是否泄漏了内存,它只是在进程完成后回收分配给进程的内容。
释放的内存可以重用(如果需要),重用可以在同一实例中发生。
Q1。您只需要假设操作系统运行正常。
问题 2.没有理由不能将字节重新分配给 foo.c,它只取决于内存分配例程的工作方式。
Q1) 我不确定您如何确认。然而,关于第二段,总是释放你分配的任何内存被认为是很好的风格。对此有一个很好的解释:当你在malloc之后不释放时,真正会发生什么?
问题 2)绝对;这些字节通常是第一个重新分配的字节(取决于 malloc 实现)。有关很好的解释,请参阅:malloc() 和 free() 如何工作?。