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

【C++】C++动态内存管理

🏳️‍🌈C/C++内存分布

说明:

1.我们的代码并非放在代码段里的,而是以文件的形式存在磁盘上的。

代码经过编译链接形成的二进制指令,才是放进代码段里的。(即可执行代码)

2.“abcd”如果没有被const修饰,那是放在栈区的。经过const修饰为只读常量后,放在代码段。

练习:

int globalVar = 1;
static int staticGlobalVar = 1;
​
void Test()
{static int staticVar = 1;int localVar = 1;int num1[10] = { 1, 2, 3, 4 };char char2[] = "abcd";const char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof(int) * 4);int* ptr2 = (int*)calloc(4, sizeof(int));int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);free(ptr1);free(ptr3);
}

(选择题) 选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)

globalVar在哪里?

staticGlobalVar在哪里?

staticVar在哪里?

localVar在哪里?

num1 在哪里?

char2在哪里?

*char2在哪里?

pChar3在哪里?

*pChar3在哪里?

ptr1在哪里?

*ptr1在哪里?

答案:

CCCAA

AAADAB

🏳️‍🌈C++的内存管理方式

new/delete

C++在原有基础上(malloc之流) 引入了new和delete。

new的用法:

//动态申请一个int类型的空间
int*p1 = new int;
​
//动态申请一个int类型的空间,并初始化为10
int*p2 = new int(10);
​
//动态申请10个int类型的空间
int*p3 = new int[10];//动态申请10个int类型的空间,并将前三个分别初始化为1、2、3
int*p = new int[5]{1,2,3};   //注意:这种方式C++98是不支持的,C++11支持

delete的用法:

delete p1;
delete p2;
delete[] p3;
​
//注:下面这种写法是错误的
delete p1,p2;   //这样写仅能delete p1

delete是一个操作符,后面直接跟操作数,不需要像free那样接 ( )。

之前C语言中学到的malloc、calloc、free等,C++中照样是可以用的。

❓那么问题来了:new/delete 和 malloc/free 的区别是什么?

区别一:在对待自定义类型上

📖其实两者对待内置类型没有区别。

但是对于自定义类型,new /delete 除了开空间还会调用构造函数和析构函数。

可见,new/delete是为自定义类型准备的。

区别二:开辟失败时

malloc申请空间失败会返回NULL,所以需要进行检查

而new申请不需要做检查,因为申请失败它直接抛异常:

通过try-catch可以知道发生了什么异常:

结果:bad allocation

区别三:new/delete是关键字,而malloc/free是函数

new/delete操作自定义类型

class A
{
public:A() {cout << "A()" << endl;}~A() {cout << "~A()" << endl;}
};
​
int main()
{A* p1 = new A;  //new自定义类型delete p1;
​A* p2 = (A*)malloc(sizeof(A));  //malloc自定义类型free(p2);
​int* p3 = new int;   //new内置类型delete p3;
​int* p4 = (int*)malloc(sizeof(int));  //malloc内置类型free(p4);return 0;
}

结果:

可见,只有new/delete在操作自定义类型时,会自动调用构造和析构函数。

new/delete的底层原理

new/delete的底层原理其实是 调用了函数operator new / operator delete来申请和释放空间。

注:这里不是运算符重载,函数名就是operator new。

👁️‍🗨️我们来看一下函数operator new :

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{void *p;while ((p = malloc(size)) == 0)  //通过malloc申请if (_callnewh(size) == 0){// 当内存不够,申请失败时// 这里会抛出bad_alloc 类型异常static const std::bad_alloc nomem;_RAISE(nomem);}return (p);
}
 

可见,operator new 实际也是通过malloc来申请空间,而operator delete是通过free来释放空间的。

既然本质还是用malloc,那兜这么一圈的意义何在?

开空间的同时封装了malloc,失败时能符合C++new的失败机制,即抛异常。

常考的笔试题

Q: malloc/free和new/delete的区别 ?

从本质上:1.new/delete是关键字,而malloc/free是函数。

从功能上:

2.malloc/free仅能开空间,而new/delete在开空间的基础上还能自动调用构造/析构函数。

3.malloc开空间时要算好具体开的字节数,而new不用,想开几个,[ ]中指定对象个数即可。

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

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

相关文章:

【C++】C++动态内存管理

&#x1f3f3;️‍&#x1f308;C/C内存分布 说明&#xff1a; 1.我们的代码并非放在代码段里的&#xff0c;而是以文件的形式存在磁盘上的。 代码经过编译链接形成的二进制指令&#xff0c;才是放进代码段里的。&#xff08;即可执行代码&#xff09; 2.“abcd”如果没有被c…...

Java中使用JTS实现WKT字符串读取转换线、查找LineString的list中距离最近的线、LineString做缓冲区扩展并计算点在缓冲区内的方位角

场景 Java中使用JTS对空间几何计算(读取WKT、距离、点在面内、长度、面积、相交等)&#xff1a; Java中使用JTS对空间几何计算(读取WKT、距离、点在面内、长度、面积、相交等)_jts-core_霸道流氓气质的博客-CSDN博客 JavaGeoTools实现WKT数据根据EPSG编码进行坐标系转换&…...

【异步VS多线程】异步VS多线程区别

异步VS多线程区别 1、异步 异步概念&#xff1a;异步是并发编程的一种形式&#xff0c;在同一时刻可以独立于主程序外&#xff0c;可以并发执行另外一些任务。异步的实现方式有两种&#xff1a; 第一种&#xff1a;通过 async TASK来实现异步&#xff0c;第二种&#xff1a;通…...

【nosql】redis之高可用(主从复制、哨兵、集群)搭建

redis群集有三种模式 redis群集有三种模式&#xff0c;分别是主从同步/复制、哨兵模式、Cluster集群&#xff0c;下面会讲解一下三种模式的工作方式&#xff0c;以及如何搭建cluster群集 ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从…...

js如何实现数组去重的常用方法

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 Set&#xff08;ES6&#xff09;⭐ 使用 filter 和 indexOf⭐ 使用 reduce⭐ 使用对象属性⭐ 使用 includes 方法&#xff08;ES6&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方…...

XREAL Air 2 Pro发布,加入电致变色技术,拓展AR眼镜使用场景

【2023年9月6日 中国北京】继刚刚宣布XREAL Air在全球销量突破20万台后&#xff0c;全球领先的消费级AR眼镜品牌XREAL今日于中国市场正式推出XREAL Air 2系列新品。全新Air 2系列包含两款AR眼镜产品&#xff1a;在显示、佩戴舒适性、音频等核心维度全面升级&#xff0c;体验全面…...

Go基础11-理解Go语言的包导入

Go语言是使用包&#xff08;package&#xff09;作为基本单元来组织源码的&#xff0c;可以说一个Go程序就是由一些包链接在一起构建而成的。虽然与Java、Python等语言相比这算不上什么创新&#xff0c;但与祖辈C语言的头文件包含机制相比则是“先进”了许多。 编译速度快是这种…...

【MySQL数据库原理】在MySQL Workbench界面运行SQL代码——学生管理系统

在 MySQL Workbench 8.0 中&#xff0c;你可以使用以下步骤新建内容并运行 MySQL 语言代码&#xff1a; 1、打开 MySQL Workbench 并连接到你的 MySQL 数据库服务器。 2、在左侧的导航栏中&#xff0c;展开你的连接以查看数据库。选择你要在其中运行 SQL 代码的数据库。 3…...

高分三号1米分辨率飞机检测识别数据集

二、背景介绍 合成孔径雷达(Synthetic Aperture Radar, SAR) 是一种主动式的微波成像系统&#xff0c;它不受光照、云雾 和气候等自然条件影响&#xff0c;具备全天时、全天候对地 观测的能力&#xff0c;已成为遥感领域重要的信息获取平 台。近年来&#xff0c;随着遥感成像技…...

Unity 之Material 类型和 MeshRenderer 组件中的 Materials 之间有一些重要的区别

文章目录 区别代码例子 区别 在Unity中&#xff0c;Material 类型和 MeshRenderer 组件中的 Materials 之间有一些重要的区别。 Material 类型&#xff1a; Material 是 Unity 中用来定义渲染属性的资源。它包含了一系列定义了如何绘制一个对象的属性&#xff0c;比如颜色、纹…...

【LeetCode-简单题】977. 有序数组的平方

文章目录 题目方法一&#xff1a;双指针方法二&#xff1a; 题目 方法一&#xff1a;双指针 class Solution { // 方法一 &#xff1a;双指针public int[] sortedSquares(int[] nums) {int left 0;int right nums.length -1 ;int[] res new int[nums.length];//结果集新数组…...

【笔试强训选择题】Day39.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…...

Prometheus-Alertmanager 警报管理器-部署和设置

文章目录 一、介绍二、核心概念1 Grouping 分组2 Inhibition 抑制3 Silences 静默&#xff08;静音&#xff09;5 High Availability 高可用性 三、部署1 二进制方式下载配置 systemd 2 docker-compose 方式 四、配置1 配置文件介绍1.1 全局配置1.2 receiver 接收器标准接收器相…...

恒运资本:小盘股的优点?投资小盘股要注意哪些方面?

股市是一个充溢时机和危险的当地&#xff0c;不同出资者有不同的偏好&#xff0c;有的人喜爱追逐大盘蓝筹股&#xff0c;有的人则钟情于小盘股。那么小盘股的长处&#xff1f;出资小盘股要注意哪些方面&#xff1f;恒运资本也为我们准备了相关内容&#xff0c;以供参考。 小盘股…...

LeetCode:2. 两数之和

这个解题思路来自代码随想录&#xff1a;代码随想录 (programmercarl.com) class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {std::unordered_map <int,int> map;for(int i 0; i < nums.size(); i) {// 遍历当前元素&am…...

OpenCV(二十四):可分离滤波

目录 1.可分离滤波的原理 2.可分离滤波函数sepFilter2D() 3.示例代码 1.可分离滤波的原理 可分离滤波的原理基于滤波器的可分离性。对于一个二维滤波器&#xff0c;如果它可以表示为水平方向和垂直方向两个一维滤波器的卷积&#xff0c;那么它就是可分离的。也就是说&#x…...

【JS进阶】防抖与节流

防抖与节流 1.防抖 1.1 为什么要防抖&#xff1f; 在项目中&#xff0c;有的操作是高频触发的&#xff0c;但是其实触发一次就好了&#xff0c;比如我们短时间内多次缩放页面&#xff0c;那么我们不应该每次缩放都去执行操作&#xff0c;应该只做一次就好。再比如说监听输入…...

【css】linear-gradient()的用法

linear-gradient() CSS函数创建一个由两种或多种颜色沿一条直线进行线性过渡的图像,其结果是<gradient>数据类型的对象,此对象是一种特殊的<image> 数据类型。 语法 /* 渐变轴为 45 度&#xff0c;从蓝色渐变到红色 */ linear-gradient(45deg, blue, red);/* 从右…...

java: 读取snakeyaml-1.26.jar各种jar包时出错; error in opening zip file

可能的问题 jar有问题idea没有权限等等其他问题。但执行后报错就是读取不了&#xff0c;还报error in opening zip file这个错。 解决问题 我的错就是jar包有问题。我先后进行了很多次把jar包位置里的东西全部删除&#xff0c;然后重新maven下载但是不管用。最后从网站上下载…...

医疗知识图谱 neo4j

开源项目&#xff1a; https://github.com/liuhuanyong/QASystemOnMedicalKG 一.效果 二.需要安装&#xff1a; pip install pyahocorasick pip install py2neo 三.需要修改&#xff1a; 需要改的点&#xff1a; 1.改连接的方式 2.改读文件的方式 MedicalGraph 运行&am…...

【LeetCode-简单题】367. 有效的完全平方数

文章目录 题目方法一&#xff1a;二分查找 题目 方法一&#xff1a;二分查找 找 1 - num 之间的 mid&#xff0c; 开方是整数 就找得到 mid&#xff0c; 不是整数自然找不到mid class Solution { // 二分查找 &#xff1b;找 1 - num 之间的mid 开方是整数 就找得到 不是…...

vben-admin中渲染table表格时怎么处理不同的数据结构

最近在用vben admin开发后台管理系统&#xff0c;vben admin这个后管端框架封装的非常细&#xff0c;颗粒度非常细&#xff0c;如果了解里面的组件或者api用法&#xff0c;那开发起来非常快。如果不了解&#xff0c;那就非常痛苦了&#xff0c;目前关于vben admin这块的开发问题…...

从零开始在树莓派上搭建WordPress博客网站并实现公网访问

文章目录 序幕概述1. 安装 PHP2. 安装MySQL数据库3. 安装 Wordpress4. 设置您的 WordPress 数据库设置 MySQL/MariaDB创建 WordPress 数据库 5. WordPress configuration6. 将WordPress站点发布到公网安装相对URL插件修改config.php配置 7. 支持好友链接样式8. 定制主题 序幕 …...

Go基础18-理解方法的本质以选择正确的receiver类型

Go语言虽然不支持经典的面向对象语法元素&#xff0c;比如类、对象、继承等&#xff0c;但Go语言也有方法。和函数相比&#xff0c;Go语言中的方法在声明形式上仅仅多了一个参数&#xff0c;Go称之为receiver参数。receiver参数是方法与类型之间的纽带。 Go方法的一般声明形式…...

Go基础12-理解Go语言表达式的求值顺序

Go语言在变量声明、初始化以及赋值语句上相比其先祖C语言做了一些改进&#xff0c;诸如&#xff1a; ● 支持在同一行声明和初始化多个变量&#xff08;不同类型也可以&#xff09; var a, b, c 5, "hello", 3.45 a, b, c : 5, "hello", 3.45 // 短变量…...

OJ练习第165题——修车的最少时间

修车的最少时间 力扣链接&#xff1a;2594. 修车的最少时间 题目描述 给你一个整数数组 ranks &#xff0c;表示一些机械工的 能力值 。ranksi 是第 i 位机械工的能力值。能力值为 r 的机械工可以在 r * n2 分钟内修好 n 辆车。 同时给你一个整数 cars &#xff0c;表示总…...

纯前端实现 导入 与 导出 Excel

最近经常在做 不规则Excel的导入&#xff0c;或者一些普通Excel的导出&#xff0c;当前以上说的都是纯前端来实现&#xff1b;下面我们来聊聊经常用到的Excel导出与导入的实现方案&#xff0c;本文实现技术栈以 Vue2 JS 为例 导入分类&#xff1a; 调用 API 完全由后端来解析数…...

关于一次两段式提交和数据库恢复数据我的一些想法

binlog是服务层的功能&#xff0c;而redolog是innodb引擎的功能&#xff0c;binlog主要用于主从复制&#xff0c;redolog主要用做数据的恢复&#xff0c;我们必须保证binlog和redolog日志数据的一致性。恢复数据时也必须遵守此一致性。 1.如果只写一次redolog会出现什么问题&a…...

阿里巴巴springcloud的gateway网关如何用继承接口WebExceptionHandler定义一个json格式的404错误页面实例

如果你想通过实现 WebExceptionHandler 接口来定义一个返回 JSON 格式的 404 错误页面的实例&#xff0c;可以按照以下方式操作&#xff1a; import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; import org.springframework.ster…...

『力扣每日一题07』字符串最后一个单词的长度

气死我啦&#xff0c;今天这道题花了快一个小时&#xff0c;我学完了答案的解法&#xff0c;放上去在线 OJ &#xff0c;一直报错&#xff0c;找来找去都找不到自己错在哪&#xff0c;明明跟答案一模一样。后来还是学了另一种解法&#xff0c;才跑出来的(̥̥̥̥̥̥̥̥o̥̥…...

力软框架做网站/网站接广告

一、前言 JDOM是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果&#xff0c;2000年初&#xff0c;JDOM作为一个开放源代码项目正式开始研发。JDOM是一种解析XML的Java工具包。 DOM 适合于当今流行的各种语言&#xff0c;包括Java,JavaScripte,VB,VBScript&#xff…...

做标签网站/理发培训专业学校

docker images|grep none|awk {print $3}|xargs docker rmi 转载于:https://www.cnblogs.com/jiuchongxiao/p/9597069.html...

主机屋做网站视频/色盲测试

jackson简单使用&#xff0c;对象转json&#xff0c;json转对象&#xff0c;json转list POJO序列化为json字符串&#xff1a; 准备一个POJO&#xff1a; JsonIgnoreProperties(ignoreUnknown true) class User implements Serializable {private static final long serialVers…...

赤峰做网站的网络公司/百度如何做广告

首先要说的是本文所说的缺陷并非指指针悬空或野指针造成的程序崩溃&#xff0c;我觉得那些问题只要小心的处理&#xff0c;是可以避免的。本文所说的缺陷是指指针对C对象封装的破坏。 想到写这个话题是因为看到有人问了一个问题“基类的私有成员会不会被子类继承&#xff1f;”…...

帮别人做诈骗网站技术/百度一下你就知道了主页

环境 VMware 15 Windows server 2016 原因 虚拟机与宿主机之间&#xff0c;虚拟机可以ping通宿主机&#xff0c;但是宿主机却ping不通虚拟机&#xff1b; 且 虚拟机和宿主机不在同一网段内。 新的解决方法 ①、虚拟机中配置好 IP地址 ②、Nat 这个是VMnet8 ③、启动 …...

西安建设企业网站/怎么样引流加微信

flowplayerFlowplayer修复Chrome的Z-index 我发现2个解决z-index修复的解决方案。 1 Flowplayer配置 改变这个&#xff1a; $f(options.id, options.url, 对此&#xff1a; $f(options.id,{src: options.url,wmode: options.wmode}, 2使用JS设置参数 $(object).prepend(…...