栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

动态内存申请(Linux)

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

动态内存申请(Linux)

我们在C语言中学习过关于动态内存申请的相关操作,例如malloc

那么在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它

此时会不会存在内存泄漏?

答案是不会,因为我们虽然没有去手动释放我们申请的内存,但是当程序结束时,操作系统会自动回收所有被这个进程申请去的资源。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/894049.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号