3

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

Q1) 我如何确认我的操作系统是否在程序终止时自动清除未“释放”的内存(使用 malloc 分配)?我正在使用带有 gcc-4.5.2 的 32 位 Ubuntu 11.04

根据 Steven Summit 的教程页面释放未使用的内存(malloc'ed)是一个好主意,但这不是强制性的。当您的程序退出时,它已分配但未释放的任何内存都应自动释放。如果您计算机会因为你的程序忘记释放它而以某种方式“丢失”内存,这表明你的操作系统存在问题或缺陷

Q2)假设, foo.c mallocs 一个 B 字节的内存。稍后, foo.c 释放这个 B 字节的内存位置并将其返回给操作系统。现在我的问题是,这些特定的 B 字节内存位置是否可以在当前实例中重新分配给 foo.c(由操作系统),或者这些 B 字节不能分配给 foo.c,直到其当前实例终止?

编辑:我建议所有阅读我的问题的人在这里这里阅读类似问题的答案。这两个答案都详细解释了 malloc() 和 free() 的交互和工作,而没有使用非常深奥的术语。要了解内核使用的内存管理工具(例如 brk()、mmap())和 C 编译器使用的内存管理工具(例如 malloc()、free())之间的区别,是一个必须阅读的内容。

4

4 回答 4

2

大多数现代操作系统将回收分配的内存,因此您不必担心。
操作系统不知道您的应用程序/程序是否泄漏了内存,它只是在进程完成后回收分配给进程的内容。

是的,可以重用释放的内存(如果需要),重用可以发生在同一个实例中。

于 2012-04-25T07:37:14.433 回答
2

当一个进程通过终止信号结束时,例如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区域是无用的,并且系统(即标准 C 库 + 内核)可以用它做任何事情。

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

于 2012-04-25T07:37:46.917 回答
1

Q1。您只需假设操作系统运行正常。

Q2。没有理由不能将字节重新分配给 foo.c 它只取决于内存分配例程的工作方式。

于 2012-04-25T07:37:21.783 回答
1

Q1)我不确定您如何确认。然而,关于第二段,总是释放你分配的任何内存被认为是一种很好的风格。在这里可以找到一个很好的解释:当你在 malloc 之后不释放时,真正发生了什么?.

Q2) 肯定;这些字节通常是第一个被重新分配的(取决于 malloc 的实现)。有关详细说明,请参阅:malloc() 和 free() 如何工作?.

于 2012-04-25T07:49:42.283 回答