正如其他人所说,将内存返回给内核是进程的职责。
通常有两种分配内存的方法:如果您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())。