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 现在不再需要,直接上就能够有所有类型的栈


 

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

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

相关文章

【计网·湖科大·思科】实验七 路由信息协议RIP、开放最短路径优先协议OSPF、边界网关协议BGP

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

2024年第四届工业自动化、机器人与控制工程国际会议 | Ei、Scopus双检索

会议简介 Brief Introduction 2024年第四届工业自动化、机器人与控制工程国际会议&#xff08;IARCE 2024&#xff09; 会议时间&#xff1a;2024年7月5 -7日 召开地点&#xff1a;中国成都 大会官网&#xff1a;www.iarce.org 2024年第四届工业自动化、机器人与控制工程国际会…

ffmpeg 时间裁剪之-ss -t与滤镜中trim=start=*:duration=*的区别和联系

背景 工作中遇到的呗。记下来贡着。 滤镜重置时间戳&#xff1a;setptsPTS-STARTPTS 在FFmpeg中&#xff0c;setptsPTS-STARTPTS是一种用于调整视频时间戳&#xff08;PTS&#xff09;的滤镜表达式。这个表达式通常用于视频编辑和处理过程中&#xff0c;用于修改视频的时间轴…

正点原子--STM32定时器学习笔记(2)

书接上文&#xff0c;本篇是对基本定时器实验部分进行的总结~ 实验目标&#xff1a;通过TIM6基本定时器定时500ms&#xff0c;让LED0每隔500ms闪烁。 解决思路&#xff1a;使用定时器6&#xff0c;实现500ms产生一次定时器更新中断&#xff0c;在中断里执行“翻转LED0”。 定时…

2024美赛C题:网球中的动量

解析&#xff1a;https://mp.weixin.qq.com/s/TOPvJ-5pjgsvjvYXt6E9Fg 2023年温网男篮决赛&#xff0c;20岁的西班牙新星卡洛斯阿尔卡拉斯 击败了36岁的诺瓦克德约科维奇。这场失利是德约科维奇自2013年以来首次在温布尔登输球 并结束了大满贯历史上最伟大的球员之一的非凡表现…

排序(6)——冒泡排序、计数排序

七、冒泡排序 1.简介 冒泡排序可以说是我们的老朋友了&#xff0c;是一种很简单的排序方法。冒泡就是泡泡在水中向上漂&#xff0c;很形象的名字和贴合它的思路&#xff0c;通过一趟趟的冒泡每一次将最大的元素冒到最后的位置处&#xff0c;这样就完成了数据的排序。 2.思路与…

开源软件的影响力

开源软件对现代信息技术产业产生了深远的影响。以下是开源软件的一些主要影响&#xff1a; 降低成本&#xff1a;开源软件允许个人和企业无需支付高额授权费即可获取高质量的软件&#xff0c;从而显著降低软件采购和使用的成本。1 提高效率&#xff1a;由于开源软件由全球开…

Spark 的Driver程序中定义的外部变量或连接为什么不能在各种算在中直接用,如果要要如何做?

在Driver程序中定义的外部变量或连接不能在算子中直接使用&#xff0c;因为它们不会被序列化并发送到各个Executor。如果需要在算子使用外部资源&#xff0c;应该在算子内部初始化这些资源。 例如&#xff0c;将RDD数据写入数据库可以这样实现&#xff1a; rdd.foreach(recor…

基于YOLOv8的船舶目标检测系统(Python源码+Pyqt6界面+数据集)

博主简介 AI小怪兽&#xff0c;YOLO骨灰级玩家&#xff0c;1&#xff09;YOLOv5、v7、v8优化创新&#xff0c;轻松涨点和模型轻量化&#xff1b;2&#xff09;目标检测、语义分割、OCR、分类等技术孵化&#xff0c;赋能智能制造&#xff0c;工业项目落地经验丰富&#xff1b; …

项目02《游戏-04-开发》Unity3D

基于 项目02《游戏-03-开发》Unity3D &#xff0c; 因前三集资源以及代码冗余问题&#xff0c;本次项目对前三集进行了重做&#xff0c;资源及代码如下&#xff0c; 首先导入场景及人物资源&#xff0c; 为人物添加动画控制器Animator组件&#xff0c; 创建动画控…

人工智能基础-matplotlib基础

绘制图形 import numpy as np x np.linspace(0, 10, 100) y np.sin(x) import matplotlib as mpl import matplotlib.pyplot as plt plt.plot(x, y) plt.show()绘制多条曲线 siny y.copy() cosy np.cos(x) plt.plot(x, siny) plt.plot(x, cosy) plt.show()设置线条颜色 …

Jasperreport 生成 PDF之省纸模式

省纸模式顾名思义就是节省纸张&#xff0c;使用 Jasper 去生成 PDF 的时候如果进行分组打印的时候&#xff0c;一页 A4 纸只会打印一组数据。这种情况下&#xff0c;如果每组数据特别少&#xff0c;只有几行&#xff0c;一页 A4 纸张根本用不了&#xff0c;就会另起一页继续打印…

【傻瓜式教程】docker运行facechain

首选&#xff0c;为了防止后期docker满&#xff0c;Docker容器 - 启动报错&#xff1a;No space left on device&#xff0c;更换一下docker存储位置 1、停止Docker服务 首先停止Docker守护进程&#xff0c;可以使用以下命令&#xff1a; sudo systemctl stop docker 备份现有…

旧衣物回收小程序开发,互联网模式下的营收有多大?

在当下快节奏的生活中&#xff0c;人们不仅生活水平在提高&#xff0c;消费水平也在逐渐提高&#xff0c;从而导致了闲置衣物的增加。为了减少浪费&#xff0c;旧衣服回收行业受到了大众的广泛关注&#xff0c;成为循环利用的一大方式。 当然&#xff0c;在当下网络时代&#…

时间复杂度为 O(n) 的排序算法

大家好&#xff0c;我是 方圆。本文介绍线性排序&#xff0c;即时间复杂度为 O(n) 的排序算法&#xff0c;包括桶排序&#xff0c;计数排序和基数排序&#xff0c;它们都不是基于比较的排序算法&#xff0c;大家重点关注一下这些算法的适用场景。 桶排序 桶排序是分治策略的一…

kingbase控制文件重建

背景&#xff1a; 测试版本&#xff1a;V008R006C005B0023 sys_control文件在数据目录的global下 若sys_control文件损坏或被删&#xff0c;会导致库无法启动 处理方式&#xff1a; 所在目录为数据目录 1、尝试dryrun touch global/sys_control sys_resetwal -l 00000001…

vue基本理解

1、js闭包&#xff0c;作用&#xff1f;&#xff1f; 闭包是指在一个函数内部&#xff0c;可以访问外部函数的变量&#xff0c;即使外部函数已经执行完毕。闭包的作用有&#xff1a; 保护变量&#xff1a;闭包可以保护函数内部的变量&#xff0c;使其不受外部环境的影响。实现…

100 个 NLP 面试问题

100 个 NLP 面试问题 一、 说明 对于技术磨练中&#xff0c;其中一项很酷的技能培训是提问。不知道答案并没有多大的错;错就错在不谷歌这些疑问。本篇就是在面试之前&#xff0c;您将此文档复制给自己&#xff0c;做一个系统的模拟实战。 二、经典NLP问题&#xff08;共8题&a…

代码随想录算法训练营第三十四天|62.不同路径 , 63. 不同路径 II

确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 62.不同路径 代码随想录 视频讲解&#xff1a;动态规划中如何初始化很重要&#xff01;| LeetCode&#xff1a;62.不同路径_哔哩哔哩_bilibili class Solut…

洪水攻击:理解与防御

一、引言 洪水攻击是一种常见的网络攻击手段&#xff0c;其特点是攻击流量巨大&#xff0c;远远超过目标系统或网络的正常处理能力。这种攻击方式会给目标系统带来巨大的压力&#xff0c;可能导致系统崩溃或网络瘫痪。本文将深入探讨洪水攻击的本质、常见类型以及防御策略。 …