内容管理(C++)

news2024/11/17 8:22:09

文章目录

  • new 和 delete
    • 对于内置类型
    • 对于自定类型
  • operator new 和 operator delete
    • new 可以抛异常
  • new[] 和 delete[]
  • (补充)定位new
  • 总结

以下测试都是在 VS2019环境下测试。

new 和 delete

对于内置类型

在C语言中,我们动态开辟内存用的是 m a l l o c malloc malloc f r e e free free,而在C++中,则是 n e w new new d e l e t e delete delete

int main()
{
	int* p1 = new int; // malloc
	int* p2 = new int[10]{ 0 };

	delete p1;
	delete [] p2;

	return 0;
}

在C++中,我们都用 n e w new new 来开辟空间,语法格式如下:

n e w new new + 类型 (对象个数) {初始化}

释放空间使用 d e l e t e delete delete 。对于内置类型来说本质上和 m a l l o c malloc malloc f r e e free free 是没有区别的。

在这里插入图片描述
如上图所示:对于这两个来说,本质都是去调用 m a l l o c malloc malloc f r e e free free

对于自定类型

class A
{
private:
	int _aa = 0;
public:
	void Print()
	{
		cout << "void Print()" << endl;
	}
	A(int _x = 0)
		:_aa(_x)
	{
		cout << "A()" << endl;
	};

	~A() 
	{
		cout << "~A()" << endl;
	};

	A(const A& AA)
	{
		_aa = AA._aa;
	}
};

在这里插入图片描述

对于自定义类型来说我们的 n e w new new 或去调用默认的构造函数, d e l e t e delete delete 会去调用析构函数。这就是 n e w new new d e l e t e delete delete 和 C语言中 m a l l o c malloc malloc f r e e free free 的区别。

operator new 和 operator delete

这两个函数是干什么的呢?

operator new 约等于 malloc
operator delete 与等于 free

在这里插入图片描述

在这里插入图片描述
对于 n e w new new 来说,他会先去调用 operator new 来开辟空间,然后再调用自定义类型的构造函数。


在这里插入图片描述

而对于 d e l e t e delete delete 来说,它先去调用 自定义类型的析构,然后再去调用 operator delete。

new 可以抛异常

在C语言中,我们 每次使用 m a l l o c malloc malloc都要去检查返回值,如果开辟失败, m a l l o c malloc malloc 返回 N U L L NULL NULL,而在C++中则是抛异常。以下是一个简单示例:
在这里插入图片描述
所以 n e w new new 我们就不需要像C语言那样每次使用 m a l l o c malloc malloc 都要去检查返回值,如上图,当我们遇到异常(空间开辟异常)直接抛异常,不会执行下面的代码,但这里会出现一个问题,那就是前面开辟的并没有释放,存在内存泄漏(以后学的更加深入了再来解决…)。

在这里插入图片描述
这里只需要记住:

n e w new new = 先 o p e r a t o r operator operator n e w new new + 再 构造
d e l e t e delete delete = 先 析构 + 再 o p e r a t o r operator operator d e l e t e delete delete

new[] 和 delete[]

这里的 n e w [ ] new[] new[] 是依次开辟 n n n个对象,每个对象都去调用构造函数,同时 d e l e t e [ ] delete[] delete[] 每个对象都要去调用 析构函数。

在这里插入图片描述

同时 这些方法最好是配套使用

例如: 用了 n e w new new 了 最好用 d e l e t e delete delete
用了 n e w p [ ] newp[] newp[] 最好用 d e l e t e [ ] delete[] delete[]。尤其是这种。
在这里插入图片描述
这里我们的A对象只有一个成员变量,根据以往的知识直到我们类的大小计算时,成员函数等是不计算的。所以我们开辟10个应该只需要40个字节啊?可是他这里为什么给了44个呢?

在这里插入图片描述
而这时,当我们把析构函数的显示定义关了之后,有只有40个字节了。

直接说结论:对于自定义类型来说,我们使用 n e w [ ] new[] new[]开辟空间之后会默认再多开辟一个4个字节的空间,存储我们后续需要析构的次数。就像这样一样:
在这里插入图片描述
我们会在p2的前面再开辟一个空间,来存储对象的数量。这个时候我们就必须要调用 d e l e t e [ ] delete[] delete[] 来释放空间了。如果只用 d e l e t e delete delete 来释放空间。编译器只会释放 p2 往后,那么前面那个空间就没有 释放掉,就会报错。这也是为什么我们要强调最好配套使用

在这里插入图片描述
当我们需要析构(显示定义析构)的时候,编译器会调整位置到前面那个存储析构次数的位置上,然后再调用 o p e r a t o r operator operator d e l e t e [ ] delete[] delete[] 来释放空间。
在这里插入图片描述
同时, o p e r a t o r operator operator d e l e t e [ ] delete[] delete[] 本质上是调用 o p e r a t o r operator operator d e l e t e delete delete o p e r a t o r operator operator d e l e t e delete delete 又是去调用的 f r e e free free

(补充)定位new

对于自定义类型而言,我们析构函数可以显示调用,但是构造函数却不可以。

这里的 operator new 只是单独开辟一块空间,并不进行任何其他活动。(就是malloc)。
在这里插入图片描述
那对于我们 operator new 开辟的空间(自定义类型)如何调用构造函数呢?

在这里插入图片描述
语法格式:

n e w new new + (地址) + 类型名 + {初始化列表}。

地址就像上图的 p2,初始化列表就是我们构造的形式(单参数,多参数)。

再来看一下多参数:

在这里插入图片描述
开辟多个对象:

在这里插入图片描述

总结

对于我们使用 n e w new new d e l e t e delete delete的时候我们直接配套使用就可以了,最好不要混着使用。

当我们使用 n e w new new [ ] [] [] 开辟空间但我们却使用 f r e e free free 释放空间的时候,我们并没有正确的释放空间(我们并没有调整到存储析构次数空间的那个位置)。所以运行报错。
在这里插入图片描述
如下图:此时我们又可以运行了,因为此时我们并不有显示定义,所以前面不会开辟那个空间存储析构次数,所以运行并没有报错,但是这只是因为我们类 A 里面并没有资源空间,如果我们有资源空间但是我们不显示定义析构的时候还是会出问题(同一片空间析构两次问题(栈:两个栈拷贝构造浅拷贝指向同一份空间,析构的也是同一份空间,free一块已经free得空间))。
在这里插入图片描述
所以:在使用的时候我们要配套使用

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

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

相关文章

家具展示预约小程序对线上生意有什么用

沙发、茶几、衣柜等各种家具用品是每个家庭必备的&#xff0c;尤其是新房更需要&#xff0c;且在客户消费能力方面通常预算也比较足&#xff0c;市场中大小品牌比较多&#xff0c;以商场店、独立门店、线上电商平台经营为主。 在实际经营中&#xff0c;厂商和经销商都需要找到…

根据脚手架archetype快速构建spring boot/cloud项目

1、找到archetype&#xff0c;并从私仓下载添加archetype到本地 点击IDEA的file&#xff0c;选择new project 选择maven项目&#xff0c;勾选create from archetype 填写archetype信息&#xff0c;&#xff08;repository填写私仓地址&#xff09; 2、选择自定义的脚手架arche…

独家详细思路-2024 辽宁省大学数学建模竞赛C题

&#xff08;1&#xff09;当其他反应条件一定时&#xff0c;分别探讨反应温度&#xff0c;溶液pH&#xff0c;吸附剂用量对As(V)和ROX去除率的影响。 重点注意&#xff1a;分别探讨 去除率 思路&#xff1a;首先进行数据的预处理&#xff0c;包括缺失值和异常值处理&#xf…

ThreeJS-3D教学十五:ShaderMaterial(noise、random)

ThreeJS-3D教学十四:ShaderMaterial(length、fract、step) 上面这篇主要是操作 fragmentShader 片元着色器,实现对物体颜色的修改,这次咱们来看下修改 vertexShader 顶点着色器,这个其实就是位移各个顶点的位置。 接下来我们先介绍下 noise 噪声函数(Perlin Noise、Sim…

ArduPilot开源飞控之AP_Mount_Topotek

ArduPilot开源飞控之AP_Mount_Topotek 1. 源由2. 框架设计3. 重要函数3.1 动态过程3.1.1 AP_Mount_Topotek::update3.1.2 AP_Mount_Backend::calculate_poi 3.2 基础能力3.2.1 AP_Mount_Topotek::healthy3.2.2 AP_Mount_Topotek::has_pan_control 3.3 设备功能3.3.1 AP_Mount_T…

【python】Python报错分析:深入探索`AttributeError`及其解决方案

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

论文翻译:Large Language Models for Education: A Survey

目录 大型语言模型在教育领域的应用&#xff1a;一项综述摘要1 引言2. 教育中的LLM特征2.1. LLMs的特征2.2 教育的特征2.2.1 教育发展过程 低进入门槛。2.2.2. 对教师的影响2.2.3 教育挑战 2.3 LLMEdu的特征2.3.1 "LLMs 教育"的具体体现2.3.2 "LLMs 教育"…

Kafka接收消息

文章目录 Acknowledgment读消息指定分区批量消费消息拦截 // 采用监听得方式接收 Payload标记消息体内容. KafkaListener(topics {"test"},groupId "hello") public void onEvent(Payload String event,Header(value KafkaHeaders.RECEIVED_TOPIC) Stri…

运算放大器(2)

&#xff08;1&#xff09;反向放大器 Vout(-R2/R1)*Vi 图一运放的同向端接地0V&#xff0c;反向端和同向端虚短&#xff0c;所以也是0V 反向输入端输入电阻很高&#xff0c;虚断&#xff0c;几乎没有电流注入和流出&#xff0c;那么R1和R2相当于是串联的&#xff0c;流过一个…

安装图形库后 帮助文档显示空白

EasyX的帮助文档显示空白 点击属性&#xff0c;选择解除锁定即可 这样就能浏览帮助文档了 电脑文件的属性中的"解除锁定"通常指的是文件或文件夹被锁定&#xff0c;导致用户无法对其进行编辑、移动或删除等操作。这种锁定可能是由于文件被其他程序占用、权限设置不当…

Spring源码十九:Bean实例化流程二

上一篇我们在Spring源码十八&#xff1a;Bean实例化流程一 中&#xff0c;主要讨论了Spring在实例化前的两重要准备工作&#xff0c;1、获取我们前面注册好的BeanDefinition&#xff0c;将GenericBeanDefinition封装为RootBeanDefinition如果Bean Definition只存在父容器中&…

“好物”推荐+Xshell连接实例+使用Conda创建独立的Python环境

目录 主题&#xff1a;好易智算平台推荐RTX 4090DGPU实例租用演示安装配置torch1.9.1cuda11.1.1环境引言&#xff1a;算力的新时代平台介绍&#xff1a;技术与信任的结晶使用案例&#xff1a;实际使用展示创建实例开始使用连接实例&#xff08;下文演示使用Xshell连接&#xff…

阿里云ECS服务器安装jdk并运行jar包,访问成功详解

安装 OpenJDK 8 使用 yum 包管理器安装 OpenJDK 8 sudo yum install -y java-1.8.0-openjdk-devel 验证安装 安装完成后&#xff0c;验证 JDK 是否安装成功&#xff1a; java -version设置 JAVA_HOME 环境变量&#xff1a; 为了确保系统中的其他应用程序可以找到 JDK&…

智能优化算法之蚁群算法ACO

蚁群算法&#xff08;Ant Colony Optimization, ACO&#xff09;由意大利学者马尔科多里戈&#xff08;Marco Dorigo&#xff09;于1992年在其博士论文中首次提出。灵感来自于自然界中的蚂蚁群体行为&#xff0c;特别是蚂蚁在寻找食物过程中所展示的路径优化能力。蚁群算法属于…

Snap Video:用于文本到视频合成的扩展时空变换器

图像生成模型的质量和多功能性的显著提升&#xff0c;研究界开始将其应用于视频生成领域。但是视频内容高度冗余&#xff0c;直接将图像模型技术应用于视频生成可能会降低运动的保真度和视觉质量&#xff0c;并影响可扩展性。来自 Snap 的研究团队及其合作者提出了 "Snap …

JAVA从入门到精通之入门初阶(二)

1. 自动类型转换 自动类型转换&#xff1a;类型范围小的变量可以赋值给类型范围大的变量 byte->int public class java_7_10 {public static void main(String[] args) {//自动类型转换//类型范围小的变量可以赋值给类型范围大的变量 byte->intbyte a 12;int b a;//自动…

MT6985(天玑9200)芯片性能参数_MTK联发科旗舰5G移动平台处理器

MT6985天玑 9200 旗舰移动平台拥有专业级影像、沉浸式游戏和先进移动显示技术&#xff0c;以及更快捷、覆盖更广的 5G 和 支持 Wi-Fi 7 连接&#xff0c;具有高性能、高能效、低功耗表现。率先采用 Armv9 性能核&#xff0c;全部支持纯 64 位应用&#xff0c;开启高能效架构设计…

华为OD机试 - 堆内存申请(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

nginx正向代理和反向代理

nginx正向代理和反向代理 正向代理以及缓存配置 代理&#xff1a;客户端不再是直接访问服务器&#xff0c;通过代理服务器访问服务端。 正向代理&#xff1a;面向客户端&#xff0c;我们通过代理服务器的IP地址访问目标服务端。 服务端只知道代理服务器的地址&#xff0c;真…

【RHCE】基于密钥的身份验证(Win-Linux)

目的&#xff1a;要提⾼系统安全性&#xff0c;通过在 OpenSSH 服务器上禁⽤密码⾝份验证来强制进⾏基于密钥的⾝份验证。 1、一台虚拟机无需密码连接另一台虚拟机 .ssh目录 > 保存了ssh相关的key和一些记录文件 &#xff08;1&#xff09;生成密钥对 使⽤这个流程在本地…