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

news2024/11/23 17:24:30

在这里插入图片描述


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;
}//new
	A* 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;
	//delete
	delete 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.coloradmin.cn/o/1194224.html

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

相关文章

使用Pytorch的一些小细节(一)

文章目录 前言数据结构-张量max函数索引函数赋值函数拼接函数 前言 由于不经常动手写代码,所以对于python语言中的常见数据结构的用法也不是很熟悉,对于pytorch中的数据结构就更加不熟悉了。之前的代码基础是基于C语言的,属性都是自己定义&a…

vue3使用element plus时遇到的问题

1.el-form中input无法输入 问题描述:在el-form中的el-input中输入数字或字母时出现卡顿,输入不进去的现象 问题原因:el-form的ref和model的名称写成了一样的单词 问题解决:两个不能一样 2.input去除边框 问题描述:…

【python海洋专题三十九】海洋指数画法--折线图样式三--不同颜色的线条

【python海洋专题三十九】海洋指数画法–折线图样式三–不同颜色的线条 数据:AMO_index 图像展示: 图片 往期推荐 图片 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画…

文心一言 VS 讯飞星火 VS chatgpt (132)-- 算法导论11.2 4题

四、用go语言,说明在散列表内部,如何通过将所有未占用的槽位链接成一个自由链表,来分配和释放元素所占的存储空间。假定一个槽位可以存储一个标志、一个元素加上一个或两个指针。所有的字典和自由链表操作均应具有 O(1)的期望运行时间。该自由…

单元测试工具-Junit

文章目录 一. 认识Junit二. Junit中常用的注解1. Test2. Disabled3. BeforeAll & AfterAll4. BeforeEach & AfterEach 三. ParameterizedTest参数化1. 单参数2. 多参数2.1. CSV 获取参数2.2. 方法获取参数 四. Order控制测试用例的执行顺序五. 断言六. 测试套件1. 通过…

node插件MongoDB(三)—— 库mongoose 的使用和数据类型(一)

前言 提示:使用mongoose 的前提是你安装了node和 MongoDB。 mongoose 官网文档:http://mongoosejs.net/docs/index.html 文章目录 前言一、安装二、基本使用1. 打开bin目录的mongod.exe文件2. 基本使用的代码(连接mongodb 服务)3.…

【C++优先队列使用】问题总结

说明&#xff1a; 文章内容为关于priority_queue的使用总结&#xff0c;在C中要包含头文件<queue>文章内容为个人的学习整理&#xff0c;如有错误&#xff0c;欢迎指正。 文章目录 1. 优先队列默认是大根堆2. 关于优先队列和sort的比较逻辑2.1 sort的比较逻辑2.2 优先队…

【学术综述】-如何写出一篇好综述-写好综述要注意的问题

文章目录 1.前置1.1 SSD 的结构1.2 FTL的架构和作用 2 动机-why&#xff1f;3 做了什么【做了哪些方面的survey】&#xff1f;4 背景知识【上下文】5 研究的问题6 每个问题对应的解决方案 从昨天晚上【2023.11.09 22:00】到今天22:29的&#xff0c;花了一天的时间在读这篇surve…

gcc [linux]

目录 背景知识 gcc如何完成 格式 预处理&#xff08;进行宏替换&#xff09; 编译&#xff08;生成汇编&#xff09; 汇编&#xff08;生成机器可执行码&#xff09; 连接&#xff08;生成可执行文件或库文件&#xff09; 函数库 静态库 静态链接优势 动态库 动态链…

Ubuntu配置Yolov8环境并训练自己的数据集

文章目录 一、环境配置与功能测试1.1 安装1.2 目标检测1.3 实例分割1.4 分类1.5 姿态检测 二、训练数据标注三、数据集训练方法3.1 命令训练3.2 代码训练 前言&#xff1a;需要先安装CUDA和Anaconda&#xff0c;它们的安装参考我这篇文章&#xff1a;Ubuntu配置深度学习环境&am…

局域网下搭建SVN服务器

文章目录 1. 下载SVN服务器(VisualSVN Server)2. 安装SVN服务器(VisualSVN Server)3. 下载并安装TortoiseSVN4. 搭建SVN服务器 1. 下载SVN服务器(VisualSVN Server) 下载地址 2. 安装SVN服务器(VisualSVN Server) 默认安装即可 Location&#xff1a;VisualSVN Server的安装…

SpringBoot前后端分离整合cas(客户端)

SpringBoot前后端分离整合cas&#xff08;客户端&#xff09; cas认证详细流程&#xff1a; 前后端分离&#xff1a;项目前端使用nginx启动&#xff0c;后端是springBoot服务&#xff1b; nginx可以统一管理Cookie&#xff0c;避免出现跨域问题。 添加依赖 <dependency&g…

探索未来,开启无限可能:打造智慧应用,亚马逊云科技大语言模型助您一臂之力

文章目录 什么是大模型&#xff1f;大模型训练方法亚马逊云科技推出生成式AI新工具 —— aws toolkit使用教程 总结 什么是大模型&#xff1f; 近期&#xff0c;生成式大模型是人工智能领域的研究热点。这些生成式大模型&#xff0c;诸如文心一言、文心一格、ChatGPT、Stable …

strcat()用法

描述 头文件&#xff1a;<string.h>char *strcat&#xff08;char *dest&#xff0c; const char *src&#xff09;功能&#xff1a;将src字符串加到dest上&#xff0c;并返回指向dest字符串的指针。 举例 #include<stdio.h> #include<string.h> int mai…

使用非递归的方式实现归并排序

使用非递归的方式实现归并排序 话不多说&#xff0c;直接上代码&#xff1a; public class MergySort {public static void main(String[] args) {int[] nums {38, 27, 43, 3, 9, 82, 10};int[] sortedArray MergySort.mergySort(nums);// 输出排序后的数组for (int num : …

神仙打架!腾讯云阿里云谁更棋高一着?

现在&#xff0c;腾讯云和阿里云都在打价格战&#xff0c;推出了一系列的优惠政策。其中&#xff0c;腾讯云服务器只需要88元&#xff0c;而阿里云服务器也只需要99元。这么便宜的价格&#xff0c;是不是让你心动不已呢&#xff1f; 腾讯云的88元服务器&#xff1a;https://te…

CG Magic分享如何解决Vray渲染器使用不了的问题?

大家在使用Vray渲染器时&#xff0c;经常会有网友反馈说&#xff0c;为什么Vray渲染器使用不了的情况&#xff1f; vray渲染器是安装中出了问题嘛&#xff0c;还是什么原因呢&#xff1f;导致vray渲染器渲染不了。 那么&#xff0c;vray渲染器怎么安装才能正常使用呢&#xff…

java try catch 异常后还会继续执行吗

1、有 try-catch 语句块&#xff0c;并且 throw 在 catch 语句块里&#xff0c;那么 try 语句块中引发异常&#xff08;报错&#xff09;的那一行代码的后续代码都不执行并且 catch 语句块后的代码也都不执行&#xff08;遇到 finally 除外&#xff09;。&#xff08;见情形一和…

已解决:Rust Error: the trait bound is not satisfied 问题

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

C# 同步异步大白话

同步异步大白话 背景 任务异步编程模型&#xff08;TAP&#xff09;提供了对异步代码的抽象。您可以像往常一样&#xff0c;将代码编写为一系列语句。您可以阅读该代码&#xff0c;就好像每条语句都在下一条语句开始之前完成一样。编译器执行许多转换&#xff0c;因为其中一些…