错综复杂的malloc和免费

我有两个相关的问题,因此我在这个单线程中询问他们。

Q1)当程序终止时,如何确认我的操作系统是否自动清除非“免费”编辑内存(使用malloc分配)? 我使用Ubuntu 11.04,32位gcc-4.5.2

根据Steven Summit的教程页面,“释放未使用的内存(malloc'ed)是一个好主意,但它不是强制性的。当你的程序退出时,它已经分配但没有释放的任何内存应该被自动释放。计算机只是因为你的程序忘记释放内存而“失去”内存,这就表明你的操作系统存在问题或缺陷 。“

Q2)假设foo.c malloc有一个B字节的内存。 稍后,foo.c释放这个B字节的内存位置并将其返回给操作系统。 现在我的问题是 ,可以将这些特定的B字节的内存位置重新分配给当前实例中的foo.c(由OS),还是这些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和其他许多有趣的东西)。

freemalloc的详细行为依赖于实现。 您应该将malloc视为获取堆内存的一种方式,并且可以free地指出以前的malloc -ed区域是无用的,系统(即标准C库+内核)可以随心所欲地执行任何操作。

使用valgrind来查找内存泄漏错误。 您也可以考虑使用Boehm的保守垃圾收集器,即使用GC_malloc而不是malloc并且不要担心释放手动内存。


大多数现代操作系统将回收分配的内存,所以您不必担心这一点。
操作系统不了解您的应用程序/程序是否泄漏了内存,或者只是在进程完成后才回收分配给进程的内容。

被释放的内存可以被重用(如果需要)并且重用可以在相同的实例中发生。


Q1。 您只需假定操作系统的行为正确。

Q2。 没有理由不能将字节重新分配给foo.c,这取决于内存分配例程如何工作。

链接地址: http://www.djcxy.com/p/80401.html

上一篇: Intricacies of malloc and free

下一篇: What happens to memory after '\0' in a C string?