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

C++的内存分布

我们之前应该讲过C语言的内存分布,一些基础的东西,其实这里也只要掌握一些基础的东西就足够了,我们看一张图片,

这一张图很清晰的表述了我们的简单内存管理,我们的静态数据是放在数据段的,申请的空间是在堆上的。这些是一些基础的东西,那么我们就由则这些基础的知识来做一道题目。

大家认真看一看,是不是变量在栈,指针也在栈,常量在代码段,开辟的空间在堆上。这句话就是上面的题目想要表达的意思。

C++的内存管理方式

大家都知道C的内存分配是malloc/realloc/calloc/free来分配空间的,这些在C++里面依然适用,但是C++自己又设计了一套,我们看看。

new/delete操作内置类型

new是开辟空间的,delete是释放空间的,其实和C语言里面有点像,也是开辟空间和释放空间。但是C++的这种好用些,方便些。我们用一段代码看看到底怎么用。

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[],注意:匹配起来使用


 new和delete操作自定义类型

我们看一段代码。

这就是C和C++的区别。C++的new和delete会调用构造函数和析构函数,但是malloc不行。这就是区别,当然内置类型也是一样的。 

operator new与operator delete函数

new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

其实,operator new就是通过malloc来实现的,operator delete就是通过free来实现的。

new和delete的实现原理

内置类型:

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是: new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。

自定义类型:

new的原理:

1. 调用operator new函数申请空间

2. 在申请的空间上执行构造函数,完成对象的构造

delete的原理:

1. 在空间上执行析构函数,完成对象中资源的清理工作

2. 调用operator delete函数释放对象的空间

new T[N]的原理:

1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请。

2. 在申请的空间上执行N次构造函数

new[ ]delete的原理:

1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理

2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间

malloc/free和new/delete的区别

相同点是都需要从堆上申请,并且需要手动释放,区别是:

1.malloc和free是函数,但是new和delete是操作符;

2.malloc申请空间不会初始化,但是new会调用构造函数进行初始化;

3.malloc申请空间必须要指定需要多少个这样的空间,但是new不用,只需带上类型就可以,申请多个就只要加上[ ],里面写要多少个就行。

4.malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型;

5.malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常;

6.申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理释放。


http://www.kler.cn/news/306431.html

相关文章:

  • FastAPI与环境变量:实现无缝切换与高效运维
  • Python操作MySQL
  • 常见生成模型有哪些?生成模型前后存在依赖关系,怎么处理更合适
  • 二分算法——优选算法
  • 排队免单模式小程序开发
  • Harmony OS DevEco Studio低代码开发流程 - HarmonyOS开发自学5
  • 【Linux进程】Linux Shell编程实战:构建简易脚本示例与技巧详解
  • Unity3D 小案例 像素贪吃蛇 02 蛇的觅食
  • Oracle EBS中AR模块的财务流程概览
  • 安全API
  • 综合案例-数据可视化-柱状图
  • python 读取excel数据存储到mysql
  • JVM 运行时数据区域
  • Amazon EC2:引领企业迈向云计算的未来
  • Lua 拷贝
  • 本地调试spark,访问kerberos鉴权的hdfs、hive
  • SOEX解锁Web3社交软件的无限可能
  • strncpy函数的使用和模拟实现
  • 远程Linux网络连接( Linux 网络操作系统 04)
  • Flutter启动无法运行热重载
  • 动态库相关知识解析
  • 教育培训小程序开发,简单实用的入门指南
  • GO 匿名函数
  • 【python版】示波器输出的csv文件(时间与电压数据)如何转换为频率与幅值【方法③】
  • 【解决方案】实验室管理系统(lims)整体解决方案设计书(word原件)
  • 探索Python轻量级数据库:TinyDB的奇妙之旅
  • QT Mode/View之View
  • CyclicBarrier的源码分析
  • 34. MyBatis如何处理SQL注入问题?有哪些防范措施?
  • 基于http请求的一种安全校验认证方案记录