Linux堆内存管理(3) 内存申请释放示例
1 堆内存申请
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *p1,*p2,*p3,*p4,*p5,*p6;
p1 = malloc(32*1024); //系统调用 brk
p2 = malloc(64*1024);
p3 = malloc(120*1024);
p4 = malloc(132*1024); //系统调用 mmap2
printf("p1: %p\n",p1);
printf("p2: %p\n",p2);
printf("p3: %p\n",p3);
printf("p4: %p\n",p4);
}
跟踪系统调用情况
strace a.out
2 内存释放再申请
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *p1,*p2,*p3,*p4,*p5,*p6;
p1 = malloc(32*1024);
p2 = malloc(64*1024);
p3 = malloc(120*1024);
p4 = malloc(132*1024);
printf("p1: %p\n",p1);
printf("p2: %p\n",p2);
printf("p3: %p\n",p3);
printf("p4: %p\n",p4);
// 内存释放再申请, 地址与p1相同,剩余的24K放在Unsorted bins
free(p1);
p5 = malloc(8*1024);
printf("p5: %p\n",p5);
free(p5);
3 内存合并
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *p1,*p2,*p3,*p4,*p5,*p6;
p1 = malloc(32*1024);
p2 = malloc(64*1024);
p3 = malloc(120*1024);
p4 = malloc(132*1024);
printf("p1: %p\n",p1);
printf("p2: %p\n",p2);
printf("p3: %p\n",p3);
printf("p4: %p\n",p4);
free(p1);
p5 = malloc(12*1024);
printf("p5: %p\n",p5);
free(p2);
p6 = malloc(80*1024);
printf("P6: %p\n",p6);
// free(p1);
// free(p2);
free(p3);
free(p4);
free(p5);
free(p6);
return 0;
}
4 大于128K的内存申请与释放
使用系统调用 mmap2和 munmap