【C++】new和delete深度解析

在这里插入图片描述


new/delete测试环境:visual studio2019社区版


一、new/delete是什么?

在C++编程中,new 和 delete 是用于动态分配和释放内存的操作符,简单来讲c++申请空间和释放空间的最好办法就是:new 和 delete,由于是操作符,所以使用new 和 delete不需要包头文件。

1.new

new:new 操作符用于动态分配内存来创建一个对象或一块内存区域,并返回一个指向分配内存的指针。它用于在堆上分配内存,以便在程序的任何地方使用,而不仅仅在栈上。通常用于创建动态对象,如类实例。

例如,创建一个整数对象并分配内存可以这样做:

int* myInt = new int;

这将在堆上分配一个整数大小的内存块,并返回一个指向该内存的指针。

2.delete

delete:delete 操作符用于释放先前由 new 分配的内存,以防止内存泄漏。它删除之前分配的内存,并将指针置为空,以防止访问已释放的内存。

例如,删除之前分配的整数对象内存可以这样做:

delete myInt;
myInt = nullptr; // 将指针置为空,以避免野指针

注意:在使用 new 分配内存后,务必使用 delete 来释放内存,以避免内存泄漏。否则,分配的内存将一直保留在堆上,直到程序终止,这可能导致内存资源耗尽。最好的做法是使用智能指针。

二、new/delete怎么用?

1.new

new会在堆上申请一片空间,并且会返回这片空间的地址,所以要用指针类型接收,如果申请空间失败,new会抛出异常值

 模板:Type* T=new Type

为内置类型申请空间:

int* mytype = new int

new内置类型注意:

1.new不会对内置类型申请的空间初始化,用户需要自己初始化。
2.new内置类型是在堆上申请空间,系统不会自己释放空间,所以需要用户使用delete手动释放空间。

为自定义类型申请空间

class A
{
public:A(int a=1){_a=a;}
private:int _a;
}//newA* p1 = new A;

new自定义类型注意:

1.new会对自定义类型申请的空间进行特殊处理,在new的过程中会调用自定义类型的构造函数。
2.new自定义类型是在堆上申请空间,系统不会自己释放空间,所以需要用户使用delete手动释放空间。

ps:查看new调用自定义类型构造的现象
在这里插入图片描述

2.delete

和new配套使用,释放new从堆上开辟的空间

//Type* T=new Type
模板:delete T;

*为内置类型释放空间

//int* mytype = new int;
delete mytype;

delete内置类型注意:

1.此时的delete行为和free()一致,单纯释放new开的空间。此时讲deletet替换成free也不会有问题

为自定义类型释放空间

class A
{
public:A(int a=1){_a=a;}
private:int _a;
};A* p1 = new A;//deletedelete p1;

delete内置类型注意:

1.此时的delete不仅仅会释放new的空间,还会调用自定义类型的析构函数,先后过程为先调用析构函数,再释放空间
ps delete调用自定义类型析构的现象
在这里插入图片描述

3.new[]

c++申请多个连续对象使用new[],其中[]中可指定申请对象的个数,如果申请失败,则会抛出异常值。

模板:Type* T = new Type[n];//申请n个对象的Type数组

为内置类型申请空间

int* mytype = new int[10];

new[]内置类型注意:

1.new不会对内置类型申请的空间初始化,用户需要自己初始化。
2.new内置类型是在堆上申请空间,系统不会自己释放空间,所以需要用户使用delete[]手动释放空间。

ps:可在定义时同时初始化,
在这里插入图片描述
为自定义类型申请空间

class A
{
public:A(int a=1){_a=a;}
private:int _a;
};A* p1 = new A[2]{01};

new[]自定义类型注意:

1.new[n]会对自定义类型申请的空间进行特殊处理,在new的过程中会调用n次自定义类型的构造函数。
2.new[]自定义类型是在堆上申请空间,系统不会自己释放空间,所以需要用户使用[]delete手动释放空间。

ps:new[n]调用构造函数现象
在这里插入图片描述

4.[]delete

delete[]功能为释放由new[]申请的连续空间。

为内置类型释放空间

int* mytype = new int[10];
delete []mytype;

[]delete释放内置类型空间注意:

1.不需要在[]delete的[]中指定对象个数
2.[]delete务必和new[]配套使用否则容易出现未定义的错误

为自定义类型释放空间

A* p1 = new A[2]{01};
delete []p1;

[]delete释放自定义类型空间注意:

1.不需要在[]delete的[]中指定对象个数
2.[]delete务必和new[]配套使用否则容易出现未定义的错误
3.在使用[]delete中会调用对象的析构函数,再释放空间,先后是:先调用析构再释放空间

ps:[]delete调用析构函数的现象
在这里插入图片描述


三、new/delete为什么?

1.为什么有operator new/operator delete?

在前面的汇编代码中我们发现new和delete都会调用operator new/operator delete
(在vs2019中delete对operator delete调用隐藏了起来),那么这是为什么呢?

在这里插入图片描述

在C++中,operator new和operator delete是用于动态内存管理的特殊函数,这两个函数不是重载函数,是c++开发者定义的两个特殊的全局函数。它们允许程序员自定义内存分配和释放的行为,以满足特定的需求。这两个操作符通常与关键字new和delete一起使用,在汇编过程中new和delete都会调用operator new/operator delete来实现开辟空间和释放空间。

实际上operator new和operator delete这两个函数的底层还是用c中用来申请和释放空间的函数“malloc”和f“ree()”实现的,operator new和operator delete是“malloc”和“free”的高级封装版本,完善了对错误的处理。c++创造operator new和operator delete是为了更好的为c++"面向对象“的概念服务,因为“malloc”和“free”对异常的处理不适合c++理念,一句话讲,就是c中原始的“malloc”和“free”不好用,c++把它们封装成了operator new和operator delete.
在这里插入图片描述


2.为什么要匹配使用new和delete?

为什么需要区分使用new和delete,new[]和delete[]?

1.正确的内存释放: 使用new和delete,new[]和delete[]的配对使用是为了确保正确的内存释放。数组对象通常需要更复杂的析构和释放过程,因此需要使用new[]和delete[]。
2.调用正确的析构函数: 使用new[]分配数组时,C++会在每个数组元素上调用构造函数,而使用delete[]释放数组时,会在每个数组元素上调用析构函数。这样确保了每个对象的构造和析构过程都被正确执行。
3.避免未定义行为: 使用new[]和delete[]配对使用可以避免因未定义的内存释放行为而引起的问题。在释放数组时,系统需要知道数组的大小,以便逐个调用对象的析构函数。

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

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

相关文章

线性代数本质系列(二)矩阵乘法与复合线性变换,行列式,三维空间线性变换

本系列文章将从下面不同角度解析线性代数的本质,本文是本系列第二篇 向量究竟是什么? 向量的线性组合,基与线性相关 矩阵与线性相关 矩阵乘法与复合线性变换 三维空间中的线性变换 行列式 逆矩阵,列空间,秩与零空间 克…

海上船舶交通事故VR模拟体验低成本高效率-深圳华锐视点

在海上运输行业,安全事故的防范和应对能力是企业安全教育的重中之重。针对这一问题,海上运输事故VR模拟逃生演练成为了一种创新且高效的教育手段。通过这种演练,企业能够在提升员工安全意识和技能方面获得多方面的帮助。 在VR船舶搜救演练中&…

基于RFbeam的V-LD1-60GHz毫米波雷达传感器数据获取(通过UART串口来控制模块)

基于RFbeam的V-LD1-60GHz毫米波雷达传感器数据获取(通过UART串口来控制模块) 文章目录 V-LD1命令发送消息回复通信示例雷达数据获取宏定义通信代码运行效果附录:压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 大小端转…

【广州华锐视点】海外制片人VR虚拟情景教学带来全新的学习体验

虚拟现实(Virtual Reality,简称VR)是一种利用电脑模拟产生一个三维的虚拟世界,提供用户关于视觉、听觉、触觉等感官的模拟体验的技术。随着科技的进步,VR已经被广泛应用到许多领域,包括游戏、教育、医疗、房…

K8S容器持续Terminating无法正常关闭(sider-car容器异常,微服务容器正常)

问题 K8S上出现大量持续terminating的Pod,无法通过常规命令删除。需要编写脚本批量强制删除持续temminating的Pod:contribution-xxxxxxx。 解决 获取terminating状态的pod名称的命令: # 获取media命名空间下,名称带contributi…

通过docker-compose部署elk日志系统,并使用springboot整合

ELK是一种强大的分布式日志管理解决方案,它由三个核心组件组成: Elasticsearch:作为分布式搜索和分析引擎,Elasticsearch能够快速地存储、搜索和分析大量的日志数据,帮助用户轻松地找到所需的信息。 Logstash&#xf…

深度学习之基于Pytorch服装图像分类识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介系统组成1. 数据集准备2. 数据预处理3. 模型构建4. 模型训练5. 模型评估 PyTorch的优势 二、功能三、系统四. 总结 一项目简介 深度学习在计算机视觉领域的…

软件测试自学指南,十年阿里测试工程师的建议

通过技能提升,入行IT可以的,但得先积累足够的经验,才能拿高薪,有个成长的过程。 软件测试岗介绍 软件测试岗位主要负责系统的测试工作,属于IT项目中的质量管理(QA)模块。 这个岗位分为两种类…

Adobe研究人员研发新AI模型LRM:实现从2D样本瞬时生成3D图像

由Adobe Research和澳大利亚国立大学(ANU)联合研发的人工智能模型宣布了一项突破性的成果,能够从单一的2D图像中生成3D图像。 研究人员表示,他们的新算法在大规模图像样本上进行训练,可以在几秒钟内生成这样的3D图像。…

【LIUNX】配置缓存DNS服务

配置缓存DNS服务 A.安装bind bind-utils1.尝试修改named.conf配置文件2.测试nslookup B.修改named.conf配置文件1.配置文件2.再次测试 缓存DNS服务器:只提供域名解析结果的缓存功能,目的在于提高数据查询速度和效率,但是没有自己控制的区域地…

阿里云国际站:应用实时监控服务

文章目录 一、阿里云应用实时监控服务的概念 二、阿里云应用实时监控服务的优势 三、阿里云应用实时监控服务的功能 四、写在最后 一、阿里云应用实时监控服务的概念 应用实时监控服务 (Application Real-Time Monitoring Service) 作为一款云原生可观测产品平台&#xff…

记忆科技携手中国电信,一站式存储打造坚实数字底座

11月10日,以“数字科技 焕新启航”为主题的2023数字科技生态大会在广州盛大开幕,本次大会由中国电信、广东省人民政府联合举办,是一场数字科技领域的年度盛会。忆联母公司记忆科技作为中国电信的合作伙伴之一受邀参会,深度参与了大…

Flink SQL -- 命令行的使用

1、启动Flink SQL 首先启动Flink的集群,选择独立集群模式或者是session的模式。此处选择是时session的模式:yarn-session.sh -d 在启动Flink SQL的client: sql-client.sh 2、kafka SQL 连接器 在使用kafka作为数据源的时候需要上传jar包到…

LabVIEW中NIGPIB设备与驱动程序不相关的MAX报错

LabVIEW中NIGPIB设备与驱动程序不相关的MAX报错 当插入GPIB-USB设备时,看到了NI MAX中列出该设备,但却显示了黄色警告指示,并且指出Windows没有与您的设备相关的驱动程序。 解决方案 需要安装能兼容的NI-488.2驱动程序。 通过交叉参考以下有…

【C++初阶(八)】C/C++内存管理详解

本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…

Leetcode刷题详解——不同路径 III

1. 题目链接:980. 不同路径 III 2. 题目描述: 在二维网格 grid 上,有 4 种类型的方格: 1 表示起始方格。且只有一个起始方格。2 表示结束方格,且只有一个结束方格。0 表示我们可以走过的空方格。-1 表示我们无法跨越的…

【读点论文】结构化剪枝

结构化剪枝 在一个神经网络模型中,通常包含卷积层、汇合层、全连接层、非线形层等基本结构,通过这些基本结构的堆叠,最终形成我们所常用的深度神经网络。 早在 1998 年,LeCun 等人使用少数几个基本结构组成 5 层的 LeNet-5 网络&…

Python爬虫过程中DNS解析错误解决策略

在Python爬虫开发中,经常会遇到DNS解析错误,这是一个常见且也令人头疼的问题。DNS解析错误可能会导致爬虫失败,但幸运的是,我们可以采取一些策略来处理这些错误,确保爬虫能够正常运行。本文将介绍什么是DNS解析错误&am…

SpringBoot从零到一项目实战落地博客系统(附源码!!!)

1.项目内容 1.1.页面展示 1.2.博客分类 1.3.面试辅导 1.4.私教带徒 1.5.文章编辑 1.6.后台管理 2.项目架构及技术描述 2.1.本项目用到的技术和框架 项目构建:Mavenweb框架:Springboot数据库ORM:Mybatis数据库连接池: HikariCP分…