C/C++的内存管理

news2024/11/23 8:03:11

C/C++的内存管理

  • 1.C/C++的内存分布
  • 2.C语言的动态内存管理方式:malloc/calloc/realloc/free
  • 3. C++内存管理方式
    • 3.1. new/delete操作内置类型
    • 3.2.new和delete操作自定义类型
  • 4.operator new与operator delete函数
    • 4.1 operator new与operator delete函数
  • 5.new和delete的实现原理
    • 5.1. 内置类型
    • 5.2.自定义类型
  • 6.定位new表达式(placement-new)
  • 7. 常见面试题
    • 7.1. malloc/free和new/delete的区别

1.C/C++的内存分布

在这里插入图片描述
【说明】

  1. 栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的。
  2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,作进程间通信。
  3. 堆用于程序运行时动态内存分配,堆是可以上增长的。
  4. 数据段–存储全局数据和静态数据
  5. 代码段–可执行的代码/只读常量

2.C语言的动态内存管理方式:malloc/calloc/realloc/free

malloc:申请空间不初始化
calloc:申请空间并初始化成0
realloc:用来扩大或缩小申请的内存空间
free:释放动态内存申请的空间,防止内存泄漏

3. C++内存管理方式

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

3.1. new/delete操作内置类型

在这里插入图片描述
在这里插入图片描述
注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[],注意:匹配起来使用

3.2.new和delete操作自定义类型

在这里插入图片描述
注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。

4.operator new与operator delete函数

4.1 operator new与operator delete函数

new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。
在这里插入图片描述
在这里插入图片描述
通过上述两个全局函数的实现知道,operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的。

5.new和delete的实现原理

5.1. 内置类型

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

5.2.自定义类型

  • new实现原理
    1. 调用operator new函数申请空间
    2. 在申请的空间上执行构造函数,完成对象的构造
  • delete的原理
    1. 在空间上执行析构函数,完成对象中资源的清理工作
    2. 调用operator delete函数释放对象的空间
  • new T[N]的原理
    1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请
    2. 在申请的空间上执行N次构造函数
  • delete[]的原理
    1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
    2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间

6.定位new表达式(placement-new)

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。

使用格式:
new (place_address) type或者new (place_address) type(initializer-list)
place_address必须是一个指针,initializer-list是类型的初始化列表

使用场景:
定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化。
在这里插入图片描述

7. 常见面试题

7.1. malloc/free和new/delete的区别

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/514624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一次查找分子级Bug的经历,过程太酸爽了

“Debugging is like trying to find a needle in a haystack, except the needle is also made of hay.” Debug调试就像是在大片的干草堆中找针一样,只不过针也是由干草制成的。 在软件开发的世界里,偶尔会出现一些非常隐蔽的 Bug,这时候工…

数据结构之“树”——二叉树、红黑树、B树、B+树、B*树

这篇文章主要简单总结下二叉树、红黑树、B树、B树、B*树的基本结构和原理。 一、二叉树 二叉树就是度不超过2的树(每个结点最多有两个子结点)。 二叉树是有序树(二叉排序树),若将其左右子树颠倒,则成为另一棵不同的二叉树。 二叉…

MYSQL跨服务器访问数据库 :FEDERATED存储引擎

当想从不同服务器的数据库获取数据时,我们会想到oracle的DBLink;sqlserver的链接访问(傻瓜式操作,按照步骤配置即可),那么mysql有没有跨服务器访问的功能呢?答案自然是有的。 博主这就分享给大家…

语音识别-置信度

1.CONFIDENCE ESTIMATION FOR ATTENTION-BASED SEQUENCE-TO-SEQUENCE MODELS FOR SPEECH RECOGNITION : https://arxiv.org/pdf/2010.11428.pdf 1.引言 1).置信度的目的: 在半监督学习和主动学习中,选择较高置信度的数据来进一步提高ASR性能…

JVM学习04:类加载与字节码技术

JVM学习04:类加载与字节码技术 1、类文件结构 一个简单的 HelloWorld.java: //HelloWorld示例 public class HelloWorld {public static void main(String[] args) {System.out.println("hello world");} }执行javac -parameters -d . Hello…

生物识别技术是否会对安全产生挑战?

生物识别技术通过人体独特的生物特征来识别个人身份,包括指纹、虹膜、面部识别、声纹识别等技术。这些技术可以在安全领域得到广泛应用,例如入境控制、安全认证、金融交易等方面。但是,生物识别技术也可能带来安全挑战,具体如下: 数据泄露:生物识别技术需要收集个人生物特…

老杨说运维 | 如何成为卓有成效的管理者(关于AIOps的几点思考)

1966年,管理学领域被誉为“大师中的大师”的彼得德鲁克出版了日后被无数次再版的经典作品——《卓有成效的管理者》。 在书中他提到:管理者的使命就是“卓有成效”,但是卓有成效并非天分赋予,而是可以通过后天学习和实践获取的能力…

python 反编译

步骤1: (前置)下载pyinstxtractor.py ①将pyinstxtractor.py文件移动到想要解包的文件目录下 ②并在当前目录下输入cmd打开终端,执行>python pyinstxtractor.py 待反编译.exe eg:E:\my_decode>python pyinstxtractor.py …

单向散列函数——获取消息的 “指纹”

目录 什么是单向散列函数散列算法的特征散列算法的用途散列算法的分类密码学哈希和非密码学哈希不安全的密码学哈希算法主流的密码学哈希算法 SHA256散列算法(SHA2算法)SHA256算法过程SM3散列算法 应该使用哪种单向散列函数呢 什么是单向散列函数 单向散…

【920信号与系统笔记】第二章 连续时间系统的时域分析

连续时间系统的时域分析 2.1引言综述n阶线性系统1.数学模型2.解法古典解法近代时域法(卷积法、算子法) 叠加积分法1.本质2. 待解决问题 2.2系统方程的算子表示法算子及其运算规则1.微分算子和积分算子2.运算规则3.电容和电感的伏安特性 转移算子1.定义2.…

20230508MTCNN1

多目标检测思路 单目标检测:图片 输入到 模型,模型输出 4个值 为什么模型只能检测单个目标? 因为模型 固定输出4个值,表示 一个目标 如何实现多目标检测?思路:一个一个地数 模型要能够 认识目标&#xff…

LiangGaRy-学习笔记-Day12

1、作业回顾 1.1、判断磁盘利用率 要求: 判断磁盘的使用率,如果超过了90%就警告 [rootNode1 sh]# vim disk_check.sh #!/bin/bash #Author By LiangGaRy #2023年5月9日 #Usage:检测硬盘的使用率 ########################################### #定义一…

蓝奥声核心技术分享——用电插座的安全保护技术(安全计量插座)

1.技术背景 用电插座的安全保护技术主要针对在用电负载接入接出(即插拔)用电插座的过程,解决瞬态异常监控及安全保护问题。该项技术涉及物联网智能硬件设备与测控技术领域,尤其涉及电能信号监测与用电安全监控的技术领域。 随着…

【Redis高级应用】分布式缓存

文章目录 单机Redis存在的问题Redis持久化RDB持久化执行时机RDB原理 AOF持久化AOF原理AOF配置AOF文件重写 RDB与AOF对比 Redis主从搭建主从架构主从数据同步原理全量同步增量同步repl_backlog原理 主从同步优化小结 Redis哨兵哨兵原理集群结构和作用集群监控原理集群故障恢复原…

MySQL多列字段去重的案例实践

同事提了个需求,如下测试表,有code、cdate和ctotal三列, select * from tt;现在要得到code的唯一值,但同时带着cdate和ctotal两个字段。 提起"唯一值",想到的就是distinct。distinct关键字可以过滤多余的重…

Machine Learning-Ex8(吴恩达课后习题)Anomaly Detection and Recommender Systems

1. Anomaly detection 内容:使用高斯模型来检测数据集中异常的数据(概率低的),先在2维数据中进行实验。样本具有两个特征:a. 服务器响应的吞吐量(mb/s) b. 延迟(ms)。 …

【linux网络】正则表达式

一、正则表达式 1.1作用范围 通常用于判断语句中,用来检查某一个字符串是否满足某一格式 1.2正则表达式的组成 普通字符包括大小写字母、数字、标点符号及其它符号元字符元字符是指在正则表达式中具有特殊意思的专用字符,可以用来规定其导字符&#…

【P18】JMeter JSON JMESPath Extractor

文章目录 一、准备工作二、测试计划设计 一、准备工作 慕慕生鲜: http://111.231.103.117/#/login 进入网页后,登录,页面提供了账户和密码 搜索框输入“虾” 右键检查或按F12,打开调试工具,点击搜索 二、测试计划设…

Bean的存取、五大注解、对象的注入方式、Bean的作用域和生命周期

一、Bean 的创建、存储和使用 PS:Java语言中的对象也叫作 Bean。 1、创建一个maven项目 PS:要在 pom.xml 中添加 spring 框架支持 PS:引入 lombok 依赖(可以帮助实现 get 和 set 方法) 2、存对象 2.1、创建类 启…

Linux 蜂鸣器驱动实验

蜂鸣器驱动原理 ①、在设备树中添加 SNVS_TAMPER1 引脚的 pinctrl 信息。 ②、在设备树中创建蜂鸣器节点,在蜂鸣器节点中加入 GPIO 信息。 1、修改设备树文件 添加 pinctrl 节点 I.MX6U-ALPHA开发板上的BEEP使用了SNVS_TAMPER1这个PIN,打开imx6ull-alien…