首先我们有两个问题
malloc()申请1G的内存能否成功?判断依据是什么?- 申请了一块空间没有
free,进程就结束了,那么空间被回收了吗?
我们写一段代码来申请1G空间试一试
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
int main()
{
char *s = (char*)malloc(1024*1024*1024);
assert(s! NULL);
printf("main over\n");
exit(0);
}
这是我们执行程序前的资源情况

这是运行程序后

我们发现好像并没有太大的区别产生,这是因为我们申请内存后会在虚拟内存上进行划分,但是只有在真的使用这块空间的时候才会真正在分配物理内存
我们将代码进行修改
memset(s,0,1024*1024*1024);
我们添加这样一段代码,让我们申请到的空间进行清零
再次执行

内存占用增加,随后程序结束,内存释放 (运行过程中,需要对不用的空间进行free,而程序结束会自动将占用的内存释放)
如果我们申请超过内存大小的空间呢

假如我们内存空间不够用了,系统会将一部分不用内容存放在虚拟内存上,但是当程序结束后,外存上存储的一部分依旧还在,为什么程序结束不把那一部分调回来呢?系统在使用这部分内容时候才会将将其调回来,否则系统是不会随便操作的,防止内存空间再次不足
swapoff -a 停止虚拟内存交换空间命令
如果我们停掉虚拟内存,再去使用程序去申请大于内存的空间,这时会直接运行失败
本文探讨了malloc申请1G内存的成功条件,内存泄漏现象,以及虚拟内存在大内存请求中的作用。通过代码实例和系统行为,解释了内存分配、回收及溢出时的内存策略。
1171

被折叠的 条评论
为什么被折叠?



