错综复杂的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
和其他许多有趣的东西)。
free
和malloc
的详细行为依赖于实现。 您应该将malloc
视为获取堆内存的一种方式,并且可以free
地指出以前的malloc
-ed区域是无用的,系统(即标准C库+内核)可以随心所欲地执行任何操作。
使用valgrind来查找内存泄漏错误。 您也可以考虑使用Boehm的保守垃圾收集器,即使用GC_malloc
而不是malloc
并且不要担心释放手动内存。
大多数现代操作系统将回收分配的内存,所以您不必担心这一点。
操作系统不了解您的应用程序/程序是否泄漏了内存,或者只是在进程完成后才回收分配给进程的内容。
被释放的内存可以被重用(如果需要)并且重用可以在相同的实例中发生。
Q1。 您只需假定操作系统的行为正确。
Q2。 没有理由不能将字节重新分配给foo.c,这取决于内存分配例程如何工作。
链接地址: http://www.djcxy.com/p/80401.html