new和delete的理解

article/2025/7/24 2:15:11

malloc、free和new、delete的区别

//malloc和free,称作c的库函数
//new和delete,称作运算符
/**********************************************/
//malloc按照字节开辟内存,返回值是void *,需要做类型强转
//仅开辟内存,不做初始化;malloc开辟内存失败,是通过返回值和nullptr比较
//new 是指定类型开辟内存,返回指定类型的类型指针;new不仅可以做内存开辟,还可以做内存初始化操作;new开辟内存失败是通过抛出bad_alloc的异常来判断的int *p=(int *)malloc(sizeof(int));
if (p==nullptr)
{return -1;
}
*p=20;//需要单独进行初始化
free(p);//等效的new和delete操作为
try
{
int *p1=new int (20);
}
catch(const bad_alloc &e)
{}
delete p1;//开辟数组类型的操作
int *q=(int *)malloc(sizeof(int)*20);
if (q==nullptr)
{return -1;
}
free(q);int *q1=new int[20];//仅负责开辟内存
int *q1=new int[20]();//这种会初始化开辟的内存为零,不能传入其他值
delete []q1;

new的种类

int *p1=new int(20);int *p2=new (nothrow) int;//不抛出异常const int *p3=new const int(40); //堆上开辟常量//定位new
int data=0;
int *p4=new (&data) int(50);//指定在data的地址,划分出内存,并可以赋值
cout<<"data:"<<data<<endl;

new/delete 与 new[]/delete[] 不可混用的深层原因

首先重载new和delete 以及new []和delete []运算符


//这里是全局运算符重载
//先开辟内存空间,再调用对象构造函数
void* operator new(size_t size)
{void* p = malloc(size);if (p == nullptr){throw bad_alloc();}cout << "operator new addr:" << p << endl;return p;
}//先析构对象,再清除内存空间
void operator delete(void* ptr)
{free(ptr);cout << "operator delete addr:" << ptr << endl;
}/*构造数组类型*/
void* operator new[](size_t size)
{void* p = malloc(size);if (p == nullptr){throw bad_alloc();}cout << "operator new[] addr:" << p << endl;return p;
}void operator delete[](void* ptr)
{cout << "operator delete addr:" << ptr << endl;free(ptr);
}

情况1

随后自定义一个Test类,用以分析new和delete。

//自定义的Test类,
class Test
{
public:Test()  { cout << "Test" << endl; }~Test() {  cout << "~Test" << endl; }
private :int x;
};
int main()
{	Test* p = new Test[5];cout << "Test类的大小:" << sizeof(Test) << endl;cout << "首个对象的地址:" << p << endl;delete[]p;
}

在这里插入图片描述
根据实验结果,可以发现开辟的内存其实地址和返回的首元素对象地址相差8个字节,这是因为当使用new[]的时候,编译器在开辟内存空间的时候会专门开辟8个字节(4或者8字节,根据编译器不同)用以存放数组的个数。所以这里开辟的内存空间应该是8+5*4=28个字节。
在这里插入图片描述
而如果在delete的时候,选择delete p,编译器认为这只是一个简单的对象,只是把数组中首元素进行了删除,而不是从p-8的位置开始释放,从而造成了内存泄露。
在这里插入图片描述

情况2

int main()
{	Test* p = new Test();delete []p;
}

创建new的时候是一个普通变量,但是在delete删除的时候告诉编译器这是一个数组。
那么编译器就会从p-8(非法内存)的位置读取虚构的数组长度值,并从p-8的位置开始释放内存。但是p-8的位置不是当前p所指向的合法空间,这是越界访问,从而出错。

小结

对于普通的编译器内置类型
new 和delete[],new[] 和delete是可以混用的。
new []和delete混用
在这里插入图片描述
new 和delete[]混用
在这里插入图片描述
**但是强烈不建议混用**!!!

对于自定义的类类型,存在析构函数,为了调用正确的析构函数,在开辟对象数组的时候,会多开辟4或8个字节,以记录对象的个数。


http://www.hkcw.cn/article/YEuWesNwMS.shtml

相关文章

如何用Python抓取Google Scholar

文章目录 [TOC](文章目录) 前言一、为什么要抓取Google Scholar&#xff1f;二、Google Scholar 抓取需要什么三、为什么代理对于稳定的抓取是必要的四、一步一步谷歌学者抓取教程4.1. 分页和循环4.2. 运行脚本 五、完整的Google Scholar抓取代码六、抓取Google Scholar的高级提…

海思 35XX MIPI读取YUV422

1.项目背景&#xff1a; 使用海思芯片&#xff0c;接收FPGA发送的MIPI数据&#xff0c;不需要ISP处理&#xff0c;YUV图像格式为YUV422。 2.移植MIPI驱动 修改IMX347的驱动远吗&#xff0c;将I2C读写的部分注释&#xff0c;其他的不用再做修改。 int imx347_slave_i2c_init(ot…

解压带密码的压缩包

在cmd中通过管理员方式运行 tar -xf "G:\BaiduNetdiskDownload\02-93套-22-SpringBoot.zip" -C "F:\springbootAllProject\un2" 前面是&#xff0c;你要解压的文件夹所在的路径&#xff0c;后面是你要解压到的位置 输完回车后会出现一个让你输密码的指令…

如何以 9 种方式将照片从 iPhone 传输到笔记本电脑

您的 iPhone 可能充满了以照片和视频形式捕捉的珍贵回忆。无论您是想备份它们、在更大的屏幕上编辑它们&#xff0c;还是只是释放设备上的空间&#xff0c;您都需要将照片从 iPhone 传输到笔记本电脑。幸运的是&#xff0c;有 9 种方便的方法可供使用&#xff0c;同时满足 Wind…

涨薪技术|0到1学会性能测试第91课-性能测试过程执行、分析、诊断、调节

至此关于系统资源监控、apache监控调优、Tomcat监控调优、JVM调优、Mysql调优、前端监控调优、接口性能监控调优的知识已分享完&#xff0c;今天开始学习性能测试流程知识。后续文章都会系统分享干货&#xff0c;带大家从0到1学会性能测试。 性能测试过程执行 当脚本开发、场景…

智绅科技——科技赋能健康养老,构建智慧晚年新生态

当老龄化浪潮与数字技术深度碰撞&#xff0c;智绅科技以 “科技赋能健康&#xff0c;智慧守护晚年” 为核心理念&#xff0c;锚定数字健康与养老服务赛道&#xff0c;通过人工智能、物联网、大数据等技术集成&#xff0c;为亚健康群体与中老年人群构建 “监测 - 预防 - 辅助 - …

基于51单片机的音乐盒键盘演奏proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1tZCAxQQ7cvyzBfztQpk0UA 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C51 是一款常用的 8 位单片机&#xff0c;由 Atmel 公司&#xff08;现已被 Microchip 收…

(独家)SAP VC物料 超级BOM怎么开单?怎么计算或发布表标准成本?

由于某公司的订单差异来源于标准成本与实际成本的差异&#xff0c;所以在开生产订单时报错&#xff1a; 在这个基础上&#xff0c;在CK11N计算标准成本时报错&#xff1a; 查了配置、前台相关的都没有相关的路径可以对可配置物料进行标准成本计算。 最后通过几天的研究&#x…

物流项目第十期(轨迹微服务)

本项目专栏&#xff1a; 物流项目_Auc23的博客-CSDN博客 建议先看这期&#xff1a; MongoDB入门之Java的使用-CSDN博客 物流项目第九期&#xff08;MongoDB的应用之作业范围&#xff09;-CSDN博客 业务需求 快递员取件成功后&#xff0c;需要将订单转成运单&#xff0c;用…

【C++高级主题】命令空间(四):命名空间成员的使用

目录 一、扼要重述&#xff1a;命名空间的本质 二、using声明&#xff1a;精准引入单个成员 2.1 定义与语法 2.2 using声明的作用域 2.3 using声明的关键特性 三、命名空间别名&#xff1a;简化长命名空间 3.1 定义与语法 3.2 使用场景 3.3 注意事项 四、using指示&a…

Java基础知识总结继承与多态详解

1. 引言 面向对象编程的核心概念 面向对象编程是模拟人的思维方式来组织代码&#xff0c;便于处理复杂的业务。 面向对象四大核心特征&#xff1a; 封装&#xff1a;将数据和操作数据的方法组合在一起&#xff0c;隐藏内部实现的具体细节&#xff0c;只需要暴露必要的接口。 …

Lyra学习笔记2 GFA_AddComponents与ULyraPlayerSpawningManagerComponent

目录 前言GameFeatureAction_AddComponentsULyraPlayerSpawningManagerComponent缓存所有PlayerStart位置选择位置 前言 1.以control模式为例 2.比较散&#xff0c;想单独拿出一篇梳理下Experience的流程 GameFeatureAction_AddComponents 这部分建议看 《InsideUE5》GameFeatu…

EDW2025|数据治理的神话破除——从误区到现实

在当今数据驱动的世界中&#xff0c;数据治理已成为企业成功的关键因素。然而&#xff0c;许多组织在实施数据治理时&#xff0c;常常被一些常见的误区所困扰。本文将逐一破除这些误区&#xff0c;揭示数据治理的真实面貌。 误区一&#xff1a;你需要一个大的预算&#xff01;…

(24)多租户 SaaS 平台设计

文章目录 2️⃣4️⃣ 多租户 SaaS 平台设计 &#x1f3e2;&#x1f510;&#x1f680; 多租户SaaS平台&#xff1a;打造云端共享公寓的隔离术&#xff01;&#x1f3d7;️ 多租户架构模型&#xff1a;三种共存方式1️⃣ 独立数据库模式2️⃣ 共享数据库&#xff0c;独立Schema模…

理想树图书:以科技赋能教育,开启AI时代自主学习新范式

深耕教育沃土 构建全场景教辅产品矩阵 自2013年创立以来&#xff0c;理想树始终以教育匠心回应时代命题。在教辅行业这片竞争激烈的领域&#xff0c;由专业教育工作者组成的理想树图书始终秉持“知识互映”理念&#xff0c;经过十余年的精耕细作&#xff0c;精心打造了小学同步…

26 C 语言函数深度解析:定义与调用、返回值要点、参数机制(值传递)、原型声明、文档注释

1 函数基础概念 1.1 引入函数的必要性 在《街霸》这类游戏中&#xff0c;实现出拳、出脚、跳跃等动作&#xff0c;每项通常需编写 50 - 80 行代码。若每次调用都重复编写这些代码&#xff0c;程序会变得臃肿不堪&#xff0c;代码可读性与维护性也会大打折扣。 为解决这一问题&…

网易 - 灵犀办公文档

一. 企业介绍 网易是中国领先的互联网技术公司&#xff0c;为用户提供免费邮箱、游戏、搜索引擎服务&#xff0c;通过开设新闻、娱乐、体育等30多个内容频道&#xff0c;以及博客、视频、论坛等互动交流&#xff0c;网聚人的力量。 为了给中小企业和个人打造一款综合性办公产…

2025年素养大赛编程赛项练习题

我用K克网盘分享了「最新素养大赛.zip」&#xff0c;点击链接即可保存。打开「K克App」&#xff0c;无需下载在线播放视频&#xff0c;畅享原画5倍速&#xff0c;支持电视投屏。 链接&#xff1a;https://pan.quark.cn/s/c2f85a297992 提取码&#xff1a;d4Uq

CSS3前端入门(第三天)2D转换 transform

转换&#xff08;transform&#xff09;是CSS3中具有颠覆性的特征之一&#xff0c;可以根据实现元素的位移、旋转、缩放等效果 移动&#xff1a;translate旋转&#xff1a;rorate缩放&#xff1a;scale 2D转换之移动translate 2D移动是2D转换里面的一种功能&#xff0c;可以…

深兰科技董事长陈海波受邀出席2025苏商高质量发展(常州)峰会,共话AI驱动产业升级

5月29日&#xff0c;2025苏商高质量发展峰会在常州隆重开幕。本次峰会聚焦新质生产力培育与产业创新转型&#xff0c;汇聚了众多江苏省内知名企业家、专家学者及政府代表。深兰科技创始人、董事长陈海波作为人工智能领域的领军企业代表&#xff0c;受邀出席盛会并参与重要活动环…