23,121
社区成员
发帖
与我相关
我的任务
分享
int main()
{
char a,b;
char *p = NULL;
// 1
p = malloc(mem_size); // mem_size = 128 *1024, 128kB
// 2
memset(p, 0, mem_size);
// 3
free(p);
p=NULL;
// 4
p = malloc(mem_size);
// 5
memset(p, 0, mem_size);
// 6
free(p);
p=NULL;
// 7
p = malloc(mem_size);
// 8
memset(p, 0, mem_size);
// 9
free(p);
p=NULL;
// 10
}
值得注意的是,比较//3 和 // 4(即第一次free前后),得到比较正常的结果
在//3处执行pmap, 得到其中一行如下:
Address Kbytes PSS Dirty Swap Mode Mapping
402f6000 144 140 140 0 rw-p [ anon ]
和//4处,
Address Kbytes PSS Dirty Swap Mode Mapping
402f6000 12 8 8 0 rw-p [ anon ]
可以看出PSS已经降低,free正常。至于为什么没map在[heap]中,希望有大虾指教。
从第二次malloc开始,就map在heap中了。且free不掉。发现 // 6和 // 7打印的信息一样。即第二次free后,heap中的空间没有被free掉
Address Kbytes PSS Dirty Swap Mode Mapping
00fb0000 260 132 132 0 rw-p [heap]
之后// 8 ~ //10都保持这个输出。
问题是:
怎么第二次开始就free不掉申请的堆呢?难道每个进程只能free一次吗?不可能的吧。