那么在Linux中也是相同的操作:我们以32位操作相同为例
我们知道,申请动态内存实质上就是从堆区(.heap)中申请,而在4G内存分布中,系统内核已经占去了1G的空间,而剩下的3个G还需要被这些区域共享,所以实际上我们从堆区申请的最大内存可能就是2.5G左右,但是 如果我们的虚拟机开启了虚拟内存的话,实际上可申请的就会比2.5G大了,例如我们虚拟机的虚拟内存是2G,此时,我们最大可从堆区申请的空间就是约4.5个G左右了
char* p=(char*)malloc(1024*1024*1024*4.5);
此时我们申请4.5G空间会成功嘛?
答案是:没有答案。
因为这个就要和实际情况联系在一起了,理论上会成功的,但是如果在申请的过程中有其他进程也调用了系统空间,此时就会申请失败。
这里我们有一点需要注意:
请大家猜一下,例如A物理内存(2G的空间 占用5%)B虚拟内存(2G的空间占用 0%)如果我们申请2G的空间,会发生什么样子的事情呢?
A(100%)B(5%)左右
为什么会发生这样的事情呢?
虚拟内存的作用就是,当我们的物理内存不够使用的时候,会将虚拟内存拿出来一部分去共享。
注意:此时共享出来的是暂时不会去调用的进程。
那么我们再猜测一下,此时free一下会发生什么样子的事情呢?
A(5%)B(5%)左右
为什么会这样呢?难道free后,物理内存不会将分出去的进程回收呢?
答案是:不会,只有在需要调用这些进程的时候,物理内存才会将这一部分进程回收。(收回来还要去管理,多麻烦啊,对吧,操作系统才没有这么傻呢)
但是但是但是 我们之前说的只是假设的情况,实际使用中 我们以32位操作系统为例,因为它就是4G的内存分布,所以我们理论上可申请的最大空间就是2.5G左右,超出范围就很有可能失败了。
那么我们在猜测一下,如果我们程序运行结束了,但是没有去free它
此时会不会存在内存泄漏?
答案是不会,因为我们虽然没有去手动释放我们申请的内存,但是当程序结束时,操作系统会自动回收所有被这个进程申请去的资源。



