C++初阶 内存管理和模板

目录

一、new

1.1什么是new?

1.2为什么要有new?

1.3使用new

1.4 new的超级好处

 二、delete

2.1什么是delete?

2.2为什么要有delete?

2.3使用delete

三、  malloc / free和new / delete的共同点和区别

四、浅谈模板

4.1什么是模板?

4.2函数模板的使用

4.3变量实例化

 4.4类模板


一、new

1.1什么是new?

C++在堆上开空间的操作为new,可以看作是C语言的malloc

1.2为什么要有new?

既然有了C语言的malloc那么为什么C++又要搞个new出来呢?功能不都一样吗,之所以要搞个new出来主要的原因还是自定义类型的定义,在C语言中我们要用malloc创建一个自定义类型的空间,不仅要用到强转,还得用到sizeof。非常的不方便,而new便可以解决这些不方便的地方

1.3使用new

使用new开辟空间有以下两种方式

1.new+类型  如new int便是直接开辟一个int大小的空间

2.new +类型+[n]  如new int[10]开辟10个int大小的空间

初始化也有两种方式

1.new int(n)  如new int(10)是开辟一个int大小的空间并将其初始化为10

2.new int[数字]{数个初始化变量} 如 new int[10]{1,2,3}是开辟十个int大小的空间,并将前三个区块初始化为1,2,3而没被初始化的区块则会被默认为0

通过监视窗口可以验证上述几点

1.4 new的超级好处

前面我们说过new可以针对自定义类型,接下来就让我们来试一下

不难看出,使用C语言的malloc来开辟空间不仅代码不简洁而且还没法初始化,而C++的new不仅可以开辟空间,而且可以通过类的构造函数对对象进行初始化,一步到位。

这时候就有小伙伴问了,你这个初始化只初始化一个变量的类,不是很捞吗,其实多个变量一样可以初始化,使用()中间加逗号作为分隔

 二、delete

2.1什么是delete?

可等价为C语言中的free,用来释放在堆上开辟的空间的

2.2为什么要有delete?

为了和new配套使用,同样也是为了处理自定义类型,delete的超级好处便是自定义类型走完它的生命周期后会走它的析构函数对变量进行处理

2.3使用delete

1.用new+类型 这种方式创建出来的空间,直接delete+空间首地址即可

2.用new+类型+[n] 这种方式创建出来的空间,得delete[]+空间首地址

不匹配使用的话程序可能会崩溃

可以看出,delete会调用对应类的析构函数

三、  malloc / free和new / 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在释放空间前会调用析构函数完成
空间中资源的清理

四、浅谈模板

4.1什么是模板?

在生活中我们常常能遇到什么万用作文模板,用固定的句式加上几个词汇的那种大家应该都见过,而我接下来我们谈的模板也和这个有异曲同工之处,都是套一套固定的模式。模板分为函数模板和类模板这两种模板。

4.2函数模板的使用

函数模板其实就是在函数的前面加上一行template<typename 变量>其中typename可以拿class来代替,它们二者有一点小区别之后我们会谈到,现在就把它俩看作等价的即可

在生活中我们经常会使用到交换函数,但是交换函数往往会涉及到不同的变量,这就令人沮丧,因为这意味着我们得根据不同的变量来因地制宜地写函数,而模板的出现便杜绝了这一情况,一个swap便可以代表所有

4.3变量实例化

在函数名和参数中间写<类型>,为显示实例化,如此不需要编译器来推理类型,直接就出来了

如下:

 4.4类模板

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类,因此不难看出它的用途,以前我们写栈得搞个typedef int StackType 现在不再需要,直接上就能够有所有类型的栈


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

可解释性AI(XAI):构建透明和值得信赖的决策过程

可解释性AI&#xff08;XAI&#xff09;旨在提高人工智能系统的透明度和可理解性&#xff0c;使人们更好地理解AI的决策过程和原理。随着AI技术的广泛应用&#xff0c;XAI成为了一个备受关注的重要领域。它不仅有助于建立人们对AI的信任&#xff0c;还可以帮助解决AI伦理和偏见…

系统添加多版本支持

记录一下最近做的一个需求&#xff1a; 前段时间做的【监狱点名系统】改成公司打卡考勤用的系统&#xff0c;里面的"服刑人员"、"监区"、"入监/出监"……等相关配置需要做改动&#xff0c;所以考虑加一个全局的标志&#xff0c;来区分一下版本。…

大数据本地环境搭建03-Spark搭建

需要提前部署好 Zookeeper/Hadoop/Hive 环境 1 Local模式 1.1 上传压缩包 下载链接 链接&#xff1a;https://pan.baidu.com/s/1rLq39ddxh7np7JKiuRAhDA?pwde20h 提取码&#xff1a;e20h 将spark-3.1.2-bin-hadoop3.2.tar.gz压缩包到node1下的/export/server目录 1.2 解压压…

EF Core入门例子(以SqLite为数据库)

测试环境&#xff1a; visual studio 2017 .net core 2.1 具体步骤如下&#xff1a; 1 新增名称为EFCoreDemo的.net core控制台程序&#xff0c;版本选择.net core 2.1&#xff0c;项目不能放到带中文的目录下&#xff0c;不然到后面执行Add-Migration命令时会报如下的错误…

关于ZYZ旋转和XYZ旋转

ZYZ旋转和XYZ旋转 概述1、XYZ旋转2、ZYZ旋转 概述 以下公式默认为右手坐标系&#xff1b;ZYZ通常可以避免死解情况&#xff0c;因此在六轴末端解算时常被用到&#xff1b;参考文章 1、XYZ旋转 XYZ旋转一般是绕固定轴旋转(外旋)&#xff0c;旋转矩阵的构成为&#xff1a;RzRy…

供应链系统架构的设计与实践

供应链系统是现代企业管理中不可或缺的一部分&#xff0c;它涉及到从原材料采购到产品销售的整个生产流程。一个高效的供应链系统可以帮助企业实现成本控制、库存优化和客户满意度提升等目标。在本文中&#xff0c;我们将讨论供应链系统的设计与实践。 一、供应链系统设计 1.…

kerberos+kafka(2.13)认证(单节点ubuntu)

一&#xff1a;搭建kerberos。 1. 运行安装命令 apt-get install krb5-admin-server krb5-kdc krb5-user krb5-config2. 检查服务是否启动。 systemctl status krb5-admin-server systemctl status krb5-kdcsystemctl start krb5-admin-server systemctl startkrb5-kdc3. 修…

GrayLog踩坑历险记

背景 GrayLog作为ELK的替代产品&#xff0c;是新生代的日志采集框架。在一个采集节点日志的需求中&#xff0c;因为节点很多&#xff0c;产生的日志也很多&#xff0c;因此尝试了使用GrayLog进行日志的采集。下面记录一下使用GrayLog中遇到的坑和解决方案。 一、部署与启动 …

【开源】WordPress一键崩溃宕机插件(整活娱乐)

插件介绍 可一键实现Wordpress崩溃宕机的整活向插件&#xff08;请勿用于非法途径&#xff0c;仅供整活娱乐&#xff09;。鼓励关注网站性能的提升&#xff0c;以提供更好的用户体验&#xff0c;提倡为用户提供良好体验和高效速度的原则。 介绍 长期以来&#xff0c;人们都在…

iOS图像处理----OpenGL ES之大长腿特效

目录 一、代码部分概括 二、实现流程概括 1、第一次加载图片 ①、GLKView初始化数据 这部分内容主要是初始化顶点数组、上下文以及顶点数组缓存区&#xff0c;需要在加载图片之前做好准备​编辑 ②、加载图片 ③、绘制 2、拉伸图片 ①、滑块调整 ②、图片拉伸过程 3、…

【React】react组件传参

【React】react组件传参 一、props&#xff1a;父组件向子组件传参1、将普通的参数作为props传递2、将jsx作为props传递&#xff08;组件插槽&#xff09; 二、自定义事件&#xff1a;子父组件向父组件传参三、context进行多级组件传参四、redux全局状态管理 一、props&#xf…

Redis客户端有哪些:你了解吗?

一、分类 Redis客户端工具是用来连接和管理redis服务器的软件&#xff0c;它们可以有不同的类型&#xff0c;如桌面客户端、web客户端和IDE插件。不同的客户端工具有各自的优缺点和特色&#xff0c;你可以根据你的需求和喜好选择合适的工具。 1、Redis 命令行工具 redis-cli官…

智慧商城(continue)

文章目录 1.静态页面结构准备和动态渲染2.搜索 - 历史记录管理1. 写好基础静态页面,可以先往里面加一点假数据2. 上面基本的渲染直接利用history渲染就可以了3. 搜索历史基本渲染结束了,开始点击搜索添加历史4. vant内用v-model" ",可以快速拿到搜索框的值5. 往历史记…

【DevOps】产品需求文档(PRD)与常见原型软件

文章目录 1、PRD介绍1.1、概述1.2、前提条件1.3、主要目的1.4、关键内容1.5、表述方式1.6、需求评审人员1.7、一般内容结构 2、需求流程3、常见原型软件3.1、Word3.2、Axure3.2.1、详细介绍3.2.2、应用分类3.2.3、优缺点 3.3、摹客RP3.4、蓝湖3.5、GUI Design Studio 1、PRD介绍…

TQ15EG开发板教程:在VIVADO2023.1 以及VITIS环境下 检测DDR4

打开VIVADO2023.1 创建一个新的工程&#xff0c;设置工程名称和地址 选择RTL工程&#xff0c;勾选不添加文件 搜索15eg&#xff0c;选择xqzu15eg-ffrb1156-2-i 完成创建工程 添加设计模块 设置模块名称 在模块中添加mpsoc器件 双击器件进行配置 若有配置文件预设可以直接导入配…

分布式任务调度框架XXL-JOB详解

分布式任务调度 概述 场景: 如12306网站根据不同车次设置放票时间点&#xff0c;商品成功发货后向客户发送短信提醒等任务,某财务系统需要在每天上午10天前统计前一天的账单数据 任务的调度是指系统为了完成特定业务&#xff0c;基于给定的时间点&#xff0c;时间间隔&#…

C# SSH.NET 长命令及时返回

在SSH中执行长时间的命令&#xff0c;SSH.NET及时在文本框中返回连续显示结果。 c# - Execute long time command in SSH.NET and display the results continuously in TextBox - Stack Overflow 博主管理了一个服务器集群&#xff0c;准备上自动巡检工具&#xff0c;测试在…

计算机网络实验二

目录 实验二 交换机的基本配置 1、实验目的 2、实验设备 &#xff08;1&#xff09;实验内容&#xff1a; &#xff08;2&#xff09;练习&#xff1a; 1.实验内容一&#xff1a;&#xff08;交换机的配置方式&#xff09; 2.实验内容二&#xff1a;&#xff08;交换机…

LabVIEW汽车自燃监测预警系统

LabVIEW汽车自燃监测预警系统 随着汽车行业的飞速发展&#xff0c;汽车安全问题日益受到公众的关注。其中&#xff0c;汽车自燃现象因其突发性和破坏性&#xff0c;成为一个不可忽视的安全隐患。为了有效预防和减少自燃事故的发生&#xff0c;提出了LabVIEW的汽车自燃监测预警…

算法学习——华为机考题库4(HJ26 - HJ30)

算法学习——华为机考题库4&#xff08;HJ26 - HJ30&#xff09; HJ26 字符串排序 描述 编写一个程序&#xff0c;将输入字符串中的字符按如下规则排序。 规则 1 &#xff1a;英文字母从 A 到 Z 排列&#xff0c;不区分大小写。 如&#xff0c;输入&#xff1a; Type 输出…