1、进程在执行的过程中,malloc申请空间,不使用时,没有free就会出现内存泄漏;
如果进程结束了,那么所有向操作系统申请的内存都会被回放(释放);
2、申请1G或者更大空间,到底能不能成功?
如果当前物理内存剩余空间够用,那么申请空间可以成功
如果当前物理内存空间不够,看有没有虚拟空间,若有,观察虚拟内存+物理内存是否满足申请大小,否则不能成功。
sudo swapoff -a;关闭虚拟内存
sudo swapon -a;开启虚拟内存
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#include<assert.h>
#include<string.h>
int main()
{
char *s=(char*)malloc(1024*1024*1024);
assert(s!=NULL);
memset(s,0,1024*1024*1024);
printf("over\n");
exit(0);
}
申请空间超过内存空间,把一部分放到交换空间(虚拟内存)
申请空间——>物理内存剩余空间+虚拟内存
3、32位操作系统进程4G虚拟空间分布
4.父进程堆区申请的空间复制后,子进程也有一份
也需要释放
fork会把进程的上下文都复制一遍,如果是malloc申请的话
内核会给子进程分配和父进程一样的空间,父子进程都需要free。
代码验证:
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#include<assert.h>
#include<string.h>
int main()
{
char *s=(char *)malloc(128);
assert(s!=NULL);
pid_t pid=fork();
assert(pid!=-1);
if(pid==0)
{
strcpy(s,"child");
}
else
{
strcpy(s,"parent");
}
printf("s=%s\n",s);
free(s);
exit(0);
}