我们在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它

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

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

动态内存申请(Linux)相关推荐

  1. 动态内存申请(malloc, calloc, new)之分配虚拟内存空间和物理内存空间

    动态内存申请(malloc, calloc, new)之分配虚拟内存空间和物理内存空间 1. 动态内存申请的底层系统调用 动态内存申请函数根据申请的内存大小选择不同的系统调用,小于128K选择brk系 ...

  2. C++---之动态内存申请new

    一.为什么需要动态内存分配? 在C++程序中,所有内存需求都是在程序执行之前通过定义所需的变量来确定的. 但是可能存在程序的内存需求只能在运行时确定的情况. 例如,当需要的内存取决于用户输入. 在这些 ...

  3. C/C++动态内存申请与释放

    20.1 理解指针的两种"改变" 普通变量(非指针,简单类 型变量)只能改变值:   1) int a = 100; 2) ... 3) a = 200;   第 1 行代码,声明 ...

  4. c语言十七:动态内存申请

    动态内存申请 一 动态内存申请 二 静态分配内存和动态分配内存 2.1 静态分配内存 2.2 动态分配内存 三 动态内存申请的相关函数 3.1 分配内存空间函数 malloc 3.2 free函数 ( ...

  5. 0x00007FF8DE6BD1E2 (ucrtbased.dll)处(位于 6-指针与动态内存申请.exe 中)引发的异常: 0xC0000005: 写入位置 0xFFFFFFFF9288D140

    0x00007FF8DE6BD1E2 (ucrtbased.dll)处(位于 6-指针与动态内存申请.exe 中)引发的异常: 0xC0000005: 写入位置 0xFFFFFFFF9288D140 ...

  6. 二维数组的动态内存申请,采用子函数的方式 为二级指针申请内存,和释放内存

    原理:二级指针,行指针+列指针 照着葫芦画瓢就行. 方法一:用c语言malloc实现 #include<cstdio> #include<iostream> #include& ...

  7. linux高端内存申请,Linux高端内存

    高端内存是指物理地址大于 896M 的内存. 对于这样的内存,无法在"内核直接映射空间"进行映射. 为什么? 因为"内核直接映射空间"最多只能从 3G 到 4G ...

  8. c语言函数申请内存,c中动态内存申请的函数

    C语言中,内存管理是通过专门的函数来实现的. (1)malloc函数: 用于分配若干字节的内存空间,并返回一个指向该内存空间首地址的指针变量. 若系统不能提供足够的内存单元,将会返回一个NULL,空指 ...

  9. C语言基础教程_动态内存申请

    文章目录 前言 一.动态分配内存概述 二.静态分配.动态分配 2.1静态分配 2.2动态分布 三.动态分配函数 3.1 malloc 3.2 free 3.3 calloc 3.4 realloc 四 ...

最新文章

  1. 快速交付 敏捷开发的特点_什么是敏捷开发?它有什么特点
  2. ICO流程,casestudy
  3. Oracle WebLogic 最新补丁的绕过漏洞分析 cve-2020-2883
  4. McAfee.VirusScan.CommandLine.V.6.0.3
  5. 传统外贸不好做,为什么不来做跨境电商?
  6. Word在固定位置插入递增数字
  7. mysql数据库及应用_mysql数据库介绍及应用
  8. linux内核Kconfig语法
  9. 服务器项目白名单设置
  10. java中多线程重要吗_Java基础知识_多线程必要知识点
  11. 我的Android进阶之旅------>解决:Failed to create ‘XXX\build\outputs\apk\xxx.apks‘: 拒绝访问。
  12. 别乱说,算法才不是脑筋急转弯
  13. JS脚本defer的作用 (转自一路前行)
  14. 将CAD图纸中的线型和文字样式合并的方法技巧(二)
  15. ubuntu16.04运行PL-SVO
  16. 电子烟中测电阻注意事项
  17. php 获取ascii码,PHP实现ASCII码与字符串相互转换的方法
  18. 关于H5页面背景音乐播放的问题
  19. 结构化软件设计的具体步骤
  20. 概览嵌入式系统的各种周边设备

热门文章

  1. MyEclipse最新版-版本更新说明及下载 - MyEclipse官方中文网
  2. 这几个好用的去图片水印免费软件,你们知道吗?
  3. D1. Remove the Substring (从easy到hard)
  4. Rejecting re-init on previously-failed class java.lang.Class<org.apache.commons.httpclient.HttpClien
  5. 可以讲点风水,不能迷信风水,做好事情是关键
  6. 解决500 Internal Privoxy Error问题
  7. 共建共享做大5G“蛋糕”
  8. matlab根轨迹临界稳定,根轨迹分析:根轨迹分析稳定性
  9. 淘宝npm镜像源换新地址
  10. 有关Maven依赖中的version