C++初阶语法——new,delete开辟/销毁动态内存空间

news2024/11/18 15:47:21

前言:在C语言中,有malloc,realloc,calloc开辟动态内存空间,free销毁动态内存空间。而在C++中,使用new开辟动态内存空间,delete销毁动态内存空间。不仅简化了操作,更为重要的是,解决自定义类型的初始化问题

目录

  • 一.简化操作
  • 二.解决自定义类型初始化问题(重点)
  • 三.new不检查失败,抛异常
    • 1.抛异常
    • 2.捕获异常(try catch)
  • 四.operator new/operator delete函数
    • 1.内置类型
    • 2.自定义类型

一.简化操作

用法:new 类型 delete 指针
创建数组:new 类型[数据个数] delete[] 指针
编译器会自动计算类型大小,并且不用再强制转换类型。大大简化了操作,但是要记住下面这三句话:一定要匹配使用!匹配使用!匹配使用!

	//int* a = (int*)malloc(sizeof(int));
	//free(a);
	int* a = new int;
	delete a;
	int* b = new int[10];
	delete[] a;

二.解决自定义类型初始化问题(重点)

new/delete 和malloc/free最大的区别就是new/delete对于自定义类型除了开空间以外会去调用它们的构造函数/析构函数
new会调用构造函数,delete会调用析构函数。

以栈类为例:

typedef int DataType;
class Stack {
public:
	Stack(int capacity = 4)//构造函数 
	{
		_arr = new DataType[capacity];
		_capacity = capacity;
		_size = 0;
	}
	void StackPush(DataType Data)
	{
		_arr[_size] = Data;
		_size++;
	}
	~Stack() //析构函数
	{
		delete[] _arr;
		_capacity = _size = 0;
	}
private:
	DataType* _arr;
	int _capacity;
	int _size;
};
int main()
{
	Stack* ptr = (Stack*)malloc(sizeof(Stack)); //malloc开辟一个自定义的栈对象
	ptr->StackPush(1); //压栈
	free(ptr);
	return 0;
}

控制台显示如下:我们知道不为0代表着程序出错,那上面代码为什么出错呢?这就是我们强调的malloc只是单纯的开辟空间,不会去调用自定义类型Stack的构造函数,也就没有初始化,没有初始化还向里面压栈肯定会出现错误的。
在这里插入图片描述

改成new和delete则不会报错:

int main()
{
	Stack* ptr = new Stack;
	ptr->StackPush(1);
	delete ptr;
	//free(ptr)  不行,free不会去调用析构函数,资源得不到清理。
	return 0;
}

三.new不检查失败,抛异常

我们用malloc开辟空间时,一般都会写一个if条件语句防止开辟空间失败,而new不再检查失败,出错时会直接抛异常,也就是说用new的话不需要再写if条件防止开辟空间失败。

void Func()
{
	//malloc
	int* a = (int*)malloc(sizeof(int)*10);
	if (a == nullptr) //if判断
	{
		return;
	}
	free(a);
	//new
	int* b = new int[10];
	delete[] b;
}

1.抛异常

用malloc开辟同样大小的空间并不会提示错误,而new会。
在这里插入图片描述

2.捕获异常(try catch)

利用try和catch捕获异常,找到出现异常的原因。

int main()
{
	try
	{
		char* p2 = new char[0x7fffffff];
	}
	catch (const exception& error)
	{
		cout << error.what() << endl;
	}
	

控制台显示如下:
在这里插入图片描述

出现异常后会发生执行流跳跃,不执行异常后的代码:

int main()
{
	try
	{
		cout << "正常" << endl;
		char* p2 = new char[0x7fffffff];
		cout << "异常" << endl;
	}
	catch (const exception& error)
	{
		cout << error.what() << endl;
	}
	return 0;
}

控制台输出如下:可以看到,输出“异常”的代码并没有被执行。这点类似goto语句,出现异常之后,就直接跳到catch语句。这样的设计避免了出错了还运行后面的语句,防止错上加错。
在这里插入图片描述

四.operator new/operator delete函数

new和delete是用户进行动态内存申请和释放的操作符,operator new和operator delete是系统提供的全局函数,new在地城调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

operator new是malloc函数的封装,也就是说,new出来的空间实际上是malloc出来的。不同的是,malloc函数出现错误会返回NULL,而C++需要的是出现错误返回异常,因此封装malloc函数,但出现错误返回异常。
operator delete原理与operator类似。

如下:operator new/operator delete使用方法与malloc/free相同。

	int* a = (int*)malloc(sizeof(int) * 10);
	free(a);
	int* b = (int*)operator new(sizeof(int) * 10);
	operator delete(b);

1.内置类型

由上,如果申请的是内置类型的空间,new和malloc,delete和free基本类似。不同的是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请和释放的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。

以下三种方式都可以释放空间,实际上都是使用free释放空间。但是第一第二种并不推荐。使用时一定要匹配使用。以避免特殊情况出现。

	int* a = new int[10];
	//都可以释放申请的空间
	//free(a);
	//delete a;
	delete[] a;

2.自定义类型

  1. new的原理
    1.调用operator new函数申请空间
    2.在申请的空间上执行构造函数,完成对象初始化。
  2. delete的原理
    1.在空间上执行析构函数,完成对象中资源的清理工作。
    2.调用operator delete函数释放对象的空间。
  3. new T[n]的原理
    1.调用operator new[]函数,在operator new[]中实际调用operator new函数完成n个对象空间的申请。
    2.在申请的空间上执行n次构造函数
  4. delete[]的原理
    1.在释放的对象空间上执行n次析构函数,完成n个对象中资源的清理工作。
    2.调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间。

文末BB:对哪里有问题的朋友,尽管在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,如果对朋友们有帮助的话,希望能给博主点点赞和关注.

在这里插入图片描述

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

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

相关文章

springcloud3 hystrix实现服务监控显示3(了解)

一 hystrix的服务监控调用 1.1 hystrix的服务监控调用 hystrix提供了准实时的监控调用&#xff08;hystrix dashbord&#xff09;&#xff0c;Hystrix 会持续的记录所有通过hystrix发送的请求的执行信息&#xff0c;并以统计报表和图形的形式展示给用户&#xff0c;包括每秒执…

在海外如何进行应用商店的关键词优化

分析市场&#xff0c;了解我们的应用类别&#xff0c;将我们的应用与竞争对手的优点和缺点进行比较&#xff0c;找到市场上的空白或所谓未满足的需求&#xff0c;并思考如何填补。 1、应用商店关键词优化。 关键词优化的目的是找到最相关的关键词 &#xff0c;并测试应用元数据…

菜鸟Vue教程 - 实现带国际化的注册登陆页面

初接触vue的时候觉得vue好难&#xff0c;因为项目中要用到&#xff0c;就硬着头皮上&#xff0c;慢慢的发现也不难&#xff0c;无外乎画个布局&#xff0c;然后通过样式调整界面。在通过属性和方法跟js交互。js就和我们写的java代码差不多了&#xff0c;复杂一点的就是引用这种…

PHP8的正则表达式-PHP8知识详解

在网页程序的时候&#xff0c;经常会有查找符合某些复杂规则的字符串的需求。正则表达式就是描述这些规则的工具。 正则表达式是把文本或者字符串按照一定的规范或模型表示的方法&#xff0c;经常用于文本的匹配操作。 例如&#xff1a;我们在填写手机号码的时候&#xff0c;…

LinkedBlockingQueue详解,深入探究LinkedBlockingQueue源码

目录 1、LinkedBlokingQueue是一个有界队列 2、LinkedBlokingQueue是一个单向队列 3、LinkedBlokingQueue中的非阻塞方法 4、LinkedBlokingQueue中的阻塞方法 LinkedBlockingQueue是通过ReentrantLock实现的&#xff08;有界/无界&#xff09;阻塞队列&#xff0c;在线程池…

PHP8的字符串操作3-PHP8知识详解

今天继续分享字符串的操作&#xff0c;前面说到了字符串的去除空格和特殊字符&#xff0c;获取字符串的长度&#xff0c;截取字符串、检索字符串。 今天继续分享字符串的其他操作。如&#xff1a;替换字符串、分割和合成字符串。 5、替换字符串 替换字符串就是对指定字符串中…

SUMO traci接口控制电动车前往充电站充电

首先需要创建带有停车位的充电站(停车场和充电站二合一)&#xff0c;具体参考我的专栏中其他文章。如果在仿真的某个时刻&#xff0c;希望能够控制电动车前往指定的充电站充电&#xff0c;并且在完成充电后继续前往车辆原来的目的地&#xff0c;那么可以使用以下API&#xff1a…

STM32 F103C8T6学习笔记8:0.96寸单色OLED显示屏显示字符

使用STM32F103 C8T6 驱动0.96寸单色OLED显示屏: OLED显示屏的驱动&#xff0c;在设计开发中OLED显示屏十分常见&#xff0c;因此今日学习一下。一篇文章从程序到显示都讲通。 文章提供源码、原理解释、测试工程下载&#xff0c;测试效果图展示。 目录 OLED驱动原理—IIC通信…

【论文解读】Hybrid-SORT: Weak Cues Matter for Online Multi-Object Tracking

因为Hybrid-SORT的baseline是基于OCSORT进行改进的&#xff0c;在这之前建议先了解byteTrack和【】的相关知识 1.介绍 1.1 基本框架 多目标跟踪(MOT)将问题分为两个子任务。第一个任务是检测每个帧中的对象。第二个任务是将它们在不同的框架中联系起来。关联任务主要通过显式…

搜狗拼音暂用了VSCode及微信小程序开发者工具快捷键Ctrl + Shit + K 搜狗拼音截图快捷键

修改搜狗拼音的快捷键 右键--更多设置--属性设置--按键--系统功能快捷键--系统功能快捷键设置--取消Ctrl Shit K的勾选--勾选截屏并设置为Ctrl Shit A 微信开发者工具设置快捷键 右键--Command Palette--删除行 微信开发者工具快捷键 删除行&#xff1a;Ctrl Shit K 或…

n5173b是德科技keysight N5173B信号发生器

产品概述 是德科技/安捷伦N5173B EXG模拟信号发生器 当您需要平衡预算和性能时&#xff0c;是德科技N5173B EXG微波模拟信号发生器是经济高效的选择。它提供解决宽带滤波器、放大器、接收机等参数测试的基本信号。执行基本LO上变频或CW阻塞&#xff0c;低成本覆盖13、20、31.…

FPGA应用学习笔记----I2S和总结

时序一致在慢时序方便得多 增加了时序分布和分析的复杂性 使用fifo会开销大量资源

SqlServer的with(nolock)关键字的用法介绍

举个例子 下面就来演示这个情况。 为了演示两个事务死锁的情况&#xff0c;我们下面的测试都需要在SQL Server Management Studio中打开两个查询窗口。保证事务不被干扰。 --1、 没有提交的事务&#xff0c;NOLOCK 和 READPAST处理的策略&#xff1a; --查询窗口一请执行如下…

python中可以处理word文档的模块:docx模块

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 话不多说&#xff0c;直接开搞&#xff0c;如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 一.docx模块 Python可以利用python-docx模块处理word文档&#xff0c;处理方式是面向对象的。 也就是说python-docx模块…

设备文件和设备绑定

实验目的&#xff1a;使用函数让设备文件和设备绑定&#xff0c;完成对LED的简单控制 在test.c中完成硬件逻辑控制 test.c #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #inclu…

openGauss学习笔记-44 openGauss 高级数据管理-存储过程

文章目录 openGauss学习笔记-44 openGauss 高级数据管理-存储过程44.1 语法格式44.2 参数说明44.3 示例 openGauss学习笔记-44 openGauss 高级数据管理-存储过程 存储过程是能够完成特定功能的SQL语句集。用户可以进行反复调用&#xff0c;从而减少SQL语句的重复编写数量&…

eUICC 识别号 (EIN)

GSMA 是业界指定的一级 EID&#xff08;eUICC 标识符&#xff09;分配机构&#xff0c;负责协调 eUICC 标识号的发行和使用。每个 eSIM 都需要具有唯一、持久且安全的 EID&#xff0c;以识别嵌入式或可移动 eUICC&#xff0c;如SGP.29中所定义。 GSMA eUICC 身份方案为每个 eUI…

“智能查单轻松实现批量快递查询,高效掌握快递物流信息!“

亲爱的用户&#xff0c;你是否常常为了查询大量快递单号而感到烦恼&#xff1f;不用担心&#xff0c;我们已经为你提供了一种高效、智能的解决方案&#xff01;现在&#xff0c;只需一键操作&#xff0c;即可实现批量快递查询&#xff0c;迅速了解每个单号的详细物流信息。 首…

网络编程(基础)

一、OSI体系结构 ISO&#xff08;国际标准化组织&#xff09;制定了一个国际标准OSI&#xff08;开放式通讯系统互联参考模型&#xff09;&#xff0c;对通讯系统进行了标准化。 定义了7层模型&#xff1a; 二、TCP/IP协议介绍 OSI模型是一个理想化的模型已经很少使用&#x…

git merge规则

参考文档&#xff1a;https://juejin.cn/post/7129333439299321887 丹尼尔&#xff1a;Hi&#xff0c;蛋兄&#xff0c;周杰伦都出新专辑了&#xff0c;你咋还不更新啊&#xff0c;真的打算半年一更啊&#xff1f; 蛋先生&#xff1a;好像确实是这样&#xff0c;要不&#xff0…