内存申请与释放
前面的内存为实际内存,后面的交换空间为虚拟内存
当申请空间小于等于内存时,先使用内存。
当申请空间d大于内存时,使用内存+虚拟内存
1、判断依据
申请1个G的空间
#include<stdio.h>
#include<stdlib.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("main over!\n");sleep(3);exit(0);
}
使用前
使用后
进程结束
没有free,进程结束后,所有分配给该进程的资源都被回收。
申请2个G的空间
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<string.h>
int main()
{char*s=(char*)malloc(1024*1024*1024*2);assert(s!=NULL);memset(s,0,1024*1024*1024*2);printf("main over!\n");sleep(3);exit(0);
}
使用前
进程结束
判断依据:
① 申请的空间 < 物理内存空间
② 申请的空间 < 物理内存空间 + 虚拟内存空间
上述两种情况是可以成功的。
如果申请空间大于物理内存空间+虚拟内存空间,那么申请空间将失败
2、申请了一个空间,没有free,进程结束,空间是否被回收
有第一个可知,没有free,进程结束后,所有分配给该进程的资源都被回收。
3、malloc 与 fork
父进程堆区申请的空间复制后,子进程也会有一份,也需要释放?
#include<stdio.h>
#include<stdlib.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);sleep(1);printf("s=%s\n",s);free(s);exit(0);}
思考:如果两次结果打印相同,代表使用同一块空间;如果不同,代表使用不同空间
结果:
子进程是子进程的空间,父进程是父进程的空间
父进程在堆区申请的空间,也会被复制到子进程中
注意:free只能写一次,但是父子进程都free了,相当于free了两次