当前位置: 首页 > news >正文

c++:内存管理

内存管理

  • 程序就是数据加算法
    (1)写程序是为了解决某个问题,生活中的问题最终被计算机抽象为控制或运算
    (2)CPU中的主要构件就是运算器和控制器,本质上是一堆组合逻辑电路,表现为机器指令集
    (3)一个问题对应一个程序,一个程序分为多个函数,一个函数分为多个机器指令
    (4)存储机器指令需要内存,机器指令的执行过程需要内存参与,这是内存的2大作用
    (5)算法对应机器指令(ROM内存),数据对应RAM内存,CPU对应工作机器
    (6)越是偏底层的语言,越对内存管理具体化,效率也越高,同时对编程者要求也越高

  • 计算机中如何管理内存
    (1)C++项目大多数对应在操作系统中运行,很少有裸机的
    (2)OS提供最基本的内存管理体系,OS直接管理物理内存,并向应用层提供一套内存接口
    (3)C++语言对OS的内存接口进行封装,提供给编程者一套内存使用方法
    (4)编程人员写的代码在编译工具链、运行时、OS等体系的帮助下最终在计算机物理层运行

C语言可用内存区域

(1)栈,对应局部变量
(2)全局数据区/静态数据区,对应全局变量,静态局部变量
(3)const数据区,在内存层面是不存在的,是C编译器营造出来的
(4)代码段,放可执行程序的,性质是rom
(5)堆heap,由malloc和free来管理的一块内存

C++新增内存区域
(1)自由存储区,由new申请得到的动态内存区域
(2)new操作符使用举例

/分配在heap中,指针p是指向a的,指针p自身是分配在栈上的
int *p = (int *)malloc(4);
*p = 7;//使用p指向的那4个字节的内存(a)
free(p);//释放p指向的那4个字节的内存(a)//C++中用新关键字new和delete替代了malloc和freeint *p = new int; // P本身是分配在栈上的,p指向的是一个int类型的数,占4字节//这4个字节分配在自由存储区*p = 10;cout << "*p:" << *p << " p:" << p << endl;delete (p);

new和malloc的区别

(1)malloc是C库函数,new是C++运算符关键字
(2)malloc申请空间大小靠传参确定,而new不需要传参,对象本身大小由编译器自动计算给出
(3)malloc返回值为void *因此需要强转,而new返回值类型为确定的对象指针类型
(4)malloc对应free释放,new对应delete和delete[]释放

(1)malloc只能申请内存不能带初始化,而new可以带初始化
(2)new会执行类的构造函数而malloc不会
(3)malloc失败返回NULL,而new失败引发bad_alloc异常
(4)申请和释放数组类型时不同

总结:

理解可用内存区域堆、栈、全局数据区、自由存储区
会使用new、delete
理解new和malloc的区别

学习记录,侵权联系删除。
来源:朱老师物联网大课堂

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux下使用arping检测IP地址是否冲突
  • 智慧园区管理系统建设方案(Word完整原件)
  • 双栈实现一个队列
  • 新手小白的pytorch学习第一弹-------张量
  • 生成日志系统和监控
  • 算法·高精度
  • C++的介绍与认识
  • 用JavaScript将 NCR(Numeric Character Reference)标记转换为对应字符的方法
  • 对称加密和非对称加密解析
  • 关于力扣150题目——逆波兰表达式求值Java实现的三种解法
  • 如何写好品牌宣传稿提升品牌曝光?看这篇文章就够了
  • Java虚拟机(JVM):深入理解与性能调优
  • 如何在应用运行时定期监控内存使用情况
  • “LNMP环境搭建实战指南:从零开始配置CentOS 7下的Nginx、MySQL与PHP“
  • C# —— Directory类
  • 收藏网友的 源程序下载网
  • 自己简单写的 事件订阅机制
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 《剑指offer》分解让复杂问题更简单
  • 【node学习】协程
  • Facebook AccountKit 接入的坑点
  • Java超时控制的实现
  • React系列之 Redux 架构模式
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 构建工具 - 收藏集 - 掘金
  • 猴子数据域名防封接口降低小说被封的风险
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 我建了一个叫Hello World的项目
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 字符串匹配基础上
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 《码出高效》学习笔记与书中错误记录
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • $$$$GB2312-80区位编码表$$$$
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1)Hilt的基本概念和使用
  • (C++哈希表01)
  • (ZT)出版业改革:该死的死,该生的生
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .JPG图片,各种压缩率下的文件尺寸
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .Net Remoting常用部署结构
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET项目中存在多个web.config文件时的加载顺序
  • 。。。。。