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.hqwc.cn/news/449911.html

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

相关文章

AI大模型专题:OWASP大语言模型应用程序十大风险V1.0

今天分享的是AI大模型系列深度研究报告&#xff1a;《AI大模型专题&#xff1a;OWASP大语言模型应用程序十大风险V1.0》。 &#xff08;报告出品方&#xff1a;OWASP&#xff09; 报告共计&#xff1a;14页 LM01:2023_ 提示词注入 描述&#xff1a;提示词注入包括绕过过滤器…

SQL注入:sqli第一关

一、实验设备&#xff1a; 需要下载并安装phpstudy_pro&#xff0c;下载sqli-labs-php7-master解压到/phpstudy_pro/www中。 二、实验步骤&#xff1a; 1、在id1后加入一个闭合符号“ ‘ ”&#xff0c;但是当你输入?id1&#xff0c;是会报错的&#xff0c; http://127.0.…

深度学习图像分类相关概念简析+个人举例1(ANN相关概念与计算)

&#xff08;1&#xff09;神经网络&#xff1a;英文全称Artificial Neural Network&#xff0c;简称为ANN。 神经网络是一种模仿人脑神经元结构和功能的人工智能模型。它由多个神经元&#xff08;也称节点、单元&#xff09;组成&#xff0c;每个神经元通过计算输入和权重的线…

实用篇 | postman在AI模型中输入speech,text,image使用详解

Postman相关直达 实用篇 | 利用FlaskPostman为深度学习模型进行快速测试(超详细)_ CSDN博客 1.基础知识 1.1.postman发送请求(json和urlencoded) 1.1.1.发送 JSON 数据请求&#xff08;form-data&#xff09;&#xff1a; 要求&#xff1a; 请求方法&#xff1a;POST&#…

jQuery前段开发--星级评价和图形跟随指针移动

一、实验原理&#xff1a; 当鼠标移入某个星星&#xff0c;前面的星星都会被点亮&#xff1b;当鼠标移出&#xff0c;星星将会变暗&#xff0c;单击某个星星后&#xff0c;即可完成评论&#xff0c;此时鼠标移出后&#xff0c;被单击星星前面的星星都会被点亮&#xff0c;后面…

ES6-let

一、基本语法 ES6 中的 let 关键字用于声明变量&#xff0c;并且具有块级作用域。 - 语法&#xff1a;let 标识符;let 标识符初始值; - 规则&#xff1a;1.不能重复声明let不允许在相同作用域内重复声明同一个变量2.不存在变量提升在同一作用域内&#xff0c;必须先声明才能试…

Mac电脑连接linux远程桌面

起因 家庭中的内网下有一台ubuntu虚拟机&#xff0c;只能通过ssh终端操作或者通过实体机进行操作实在有些不方便。所以便想着通过linux远程桌面的方式进行连接&#xff0c;由于家庭内网&#xff0c;延迟还是非常低的。 步骤 首先在ubuntu虚拟机上安装xrdp&#xff08;可能已…

深度解析源码,Spring 如何使用三级缓存解决循环依赖

目录 一. 前言 二. 基础知识 2.1. 什么是循环依赖&#xff1f; 2.2. 三级缓存 2.3. 原理执行流程 三. 源码解读 3.1. 代码入口 3.2. 第一层 3.3. 第二层 3.4. 第三层 3.5. 返回第二层 3.6. 返回第一层 四. 原理深度解读 4.1. 什么要有三级缓存&#xff1f; 4.2.…

ToF传感器在移动机器人中的作用

原创 | 文 BFT机器人 在日新月异的机器人技术领域&#xff0c;技术的无缝整合正引领着人类与机器交互方式的革新潮流。ToF传感器作为变革性创新的一个例子&#xff0c;对移动机器人更好地感知周围环境起到了决定性的作用。 ToF传感器与激光雷达技术在创建深度图方面有着异曲同…

Vue3学习记录(一)--- 组合式API之基础概念和变量声明

一、组合式API基础 1、简介 ​ 组合式 API (Composition API) 是Vue3和Vue2的v2.7之后版本中的全新特性&#xff0c;是一系列API的的集合&#xff08;响应式API、生命周期钩子、依赖注入等等&#xff09;&#xff0c;其风格是基于函数的组合&#xff0c;以一种更直观、更灵活…

python+django+vue高校学生社团管理系统euw84

社团管理系统是一个B/S模式系统&#xff0c;采用django框架&#xff0c;MySQL数据库设计开发&#xff0c;充分保证系统的稳定性。在系统的测试环节&#xff0c;主要通过功能测试的方式&#xff0c;验证系统的功能设计是否符合要求&#xff0c;能否满足使用需求。本社团管理系统…

论文阅读-在分布式数据库环境中对哈希算法进行负载均衡基准测试

论文名称&#xff1a;Benchmarking Hashing Algorithms for Load Balancing in a Distributed Database Environment 摘要 现代高负载应用使用多个数据库实例存储数据。这样的架构需要数据一致性&#xff0c;并且确保数据在节点之间均匀分布很重要。负载均衡被用来实现这些目…