正如其他人所说,将内存返回给内核是进程的职责。
通常有两种分配内存的方法:如果您malloc()
/new
内存块超过一定大小,则内存会从操作系统通过分配,mmap()
并在空闲时立即返回。sbrk
通过向上移动边界来增加进程的数据区域来分配较小的块。只有在该段末尾有超过一定大小的块空闲时,才会释放此内存。
eg:(伪代码,我不太懂C++)
a = new char[1000];
b = new char[1000];
内存映射:
---------------+---+---+
end of program | a | b |
---------------+---+---+
如果你现在自由a
了,你中间有一个洞。它没有被释放,因为它不能被释放。如果你 free b
,进程的内存可能会也可能不会减少;未使用的剩余部分返回系统。
一个简单的程序测试
#include <stdlib.h>
int main()
{
char * a = malloc(100000);
char * b = malloc(100000);
char * c = malloc(100000);
free(c);
free(b);
free(a);
}
导致strace
输出像
brk(0) = 0x804b000
brk(0x8084000) = 0x8084000
brk(0x80b5000) = 0x80b5000
brk(0x809c000) = 0x809c000
brk(0x8084000) = 0x8084000
brk(0x806c000) = 0x806c000
is 显示该brk
值首先增加(对于malloc()
),然后再次减少(对于free()
)。