【C++】024、new[]与delete[]配对使用

C++动态数组(vector/pair)专项刷题清单 本文题库聚焦动态数组纯语法练习,覆盖高频考点,中文易上手。刷题核心是吃透语法,练熟后可轻松应对作业、笔试,为后续学习打下基础。 阅读详情

一、new[]与delete[]

  • new[]与delete[]必须配对使用,这是铁律,否则会触发未定义行为

  • 可能会导致程序崩溃,是否崩溃具体还要看,数组中元素类型是否有非平凡析构函数,以及编译器实现是否在分配时记录了元素个数。

  • 乱用delete最坏的情况是内存泄漏,和堆元数据损坏。

二、new[]调用的底层操作

当执行 T *p = new T[n]; 时编译器除了给数组对象分配内存和调用构造函数外,还做了两个操作:

1、记录元素个数:

  • 为了在delete[]时知道需要调用多少次析构函数,编译器通常在返回指针的前方(头部)存储元素个数n

2、返回偏移地址:

  • 返回给p的地址,并不是原始分配内存的起始地址,而是原始地址+头部大小的位置。

数据分配地址示意图:

实际分配的内存块(由堆管理器管理):
┌──────────────┬─────────────────────────────────────┐
│  头部 (Header) │  元素0  │  元素1  │ ... │  元素n-1 │
│ 存储 n 的值   │  (对象)  │  (对象)  │     │  (对象)  │
└──────────────┴─────────────────────────────────────┘
                  ↑
                  p 指向这里(用户拿到的地址)

三、乱用delete的三个场景

1、数组元素有非平凡析构函数(string,自定义类)

  • 错误写法: string *p = new string[10]; delete p;

部分对象的析构函数未调用,导致内存泄漏

  • 因为delete p 只会调用p[0] 这一个元素的析构函数,而p[1]到p[9]的析构函数完全不被调用,如果这些string内部持有堆内存,这9个字符串的内部内存全部泄漏

堆元数据损坏导致崩溃

  • delete会把p的地址直接传给底层operate delete,也就是free函数,但free需要的是原始分配内存的起始地址(头部之前的地址),现在传给他的事便宜后的地址p,堆管理器找不到对应的头部元数据,会将这块内存的元数据胡乱解析,导致堆内存链表断裂,程序通常不会立刻崩溃,而是会在下一次malloc/free时触发corruption崩溃。

2、数据元素是平凡类型(int char等)

  • 错误写法:int *p = new int[10]; delete p;

  • int没有析构函数,不会因为析构函数导致内存泄漏问题

  • 而且因为int没有析构函数,p底层地址也不会存储头部计数,传给delete的地址free正好是正确的原始地址。

  • 但是有些编译器会因为开启了优化,导致处理头部对齐策略时立刻发生崩溃。

3、反向调用,用delete[]释放new单个对象

  • 错误用法:string *p = new string(); delete[] p; 结果会立即崩溃。

  • 原理:delete[]会假定p前面有元素个数的头部内存,于是他去p地址的前面读取一个整数当做n,然后试图循环调用n次对象的构造函数。

  • 而p前面的内促是随机垃圾值,n是个天文数字,程序会疯狂调用析构函数,访问非法地址。

四、工程实战原则

  1. 绝对禁止裸new[] 和 delete[] 出现在业务代码中

  2. 用vector<T> 替代动态数组,内部实现了new[]/delete[]配对

  3. 如果非要用原始数组,用智能指针unique_ptr<T[]>,在析构时会自动调用delete[]

Java枚举类深度解析与应用实战 枚举(Enum)是Java中表示固定常量集合的特殊数据类型,通过类型安全机制避免了传统常量的缺陷。其核心原理是JVM级别的单例实现,每个枚举常量都是唯一的类实例。枚举技术价值在于将常量组织为类型安全的命名空间,支持方法、属性和接口实现等面向对象特性。典型应用场景包括状态机管理、策略模式实现和系统配置选项等。在Java开发中,枚举与EnumSet、EnumMap等工具类配合使用,能显著提升代码可读性和运行时性能。本文以Java枚举为核心,详细剖析其在单例模式、策略模式等设计模式中的实战应用,并深入讲解序列化、 阅读详情

相关推荐

C++怎么学?零基础也可以,一份完整学习路线图助你搞定!

提供一条清晰、系统且实践导向的C++学习路径。从基础语法、面向对象、泛型编程、异常处理,逐步深入STL、智能指针、并发编程等现代C++高级特性。无论是新手还是希望提升,通过系统学习与项目实践,助您将理论知识转化为实际解决问题的能力。

Lion_Long的博客 4022

【C++】内存管理

C语言中动态申请一块空间//内存不够 报错退出exit(1);在C语言中,动态申请一块内存需要单独的函数,函数里面有空间申请,检查合理性,初始化等,然后用这个函数实现动态内存申请C++中申请空间class Apublic:: _a(a)~A()private:int _a;int main()//动态申请一块空间delete p2;delete p4;//通过new动态申请10个连续空间return 0;p2的地址值: 0x600002f4c000。

2501_93806388的博客 533

【python快速编程入门(第二版)黑马程序员课后编程题】

python快速编程入门(第二版)黑马程序员课后编程题

weixin_46167259的博客 1万+

024:这是什么鬼delete

题目: http://cxsjsxmooc.openjudge.cn/2021t3springall2/024/ 分析: 这题没什么好分析的,就是虚函数的应用。pa是类A指针,在new B的时候会调用类A对象的构造函数(类B是类A的派生类),那delete pa的时候,会调用析构函数,根据虚函数的特性,pa指向的是类B对象,故调用类B的析构函数,然后根据先析构派生类后析构基类的准则,再调用类A的析构函数。 参考代码: #include <iostream> using namespa

Simon博的博客 623

避坑指南:用逐飞开源库驱动MT9V03X摄像头时容易忽略的3个细节(附TFT显示优化技巧)

本文详细解析了在智能汽车竞赛中使用MT9V03X摄像头(总钻风)时常见的硬件连接、图像采集和TFT显示优化问题。重点介绍了逐飞开源库中容易被忽略的三个关键细节,包括电源管理、看门狗设置和中断优先级配置,并提供了针对IPS200和TFT180显示屏的优化技巧,帮助参赛队伍提升图像处理效率和显示质量。

study的专栏 743

STK轨道仿真环境搭建实战:从地月系到多天体场景

本文详细介绍了STK轨道仿真环境搭建的实战指南,从基础的地月系统到复杂的多天体场景。通过逐步操作说明和实用技巧,帮助用户快速掌握STK软件的使用方法,提升轨道仿真效率,适用于航天任务设计和教学演示。

weixin_30312563的博客 397

C++面向对象程序设计 024:这是什么鬼delete ---- (北大Mooc)

原题题目 #include <iostream> using namespace std; class A { public: A() { } // 在此处补充你的代码 }; class B:public A { public: ~B() { cout << "destructor B" << endl; } }; int main() { A * pa; pa = new B; delete pa; return 0; }

Love 6's Private Blog 785

基于 OptiSystem 的掺铒光纤放大器(EDFA)分析

通过构建 EDFA 仿真模型,系统分析了铒离子掺杂半径、离子浓度、光纤长度及泵浦功率等关键参数对放大器增益和噪声特性的影响规律,为 EDFA 的优化设计提供了理论依据与仿真支撑。继续增大至 9μm,增益趋于稳定(约 19dB)。继续增加至 200mW,增益仅增加 2dB,表明泵浦功率存在阈值效应(约 100mW),超过后增益饱和明显。:作为增益介质,主要参数包括光纤长度(5~50m)、铒离子掺杂半径(1~10μm)、离子浓度(1×10²⁵~5×10²⁵m⁻³)、纤芯半径 2.2μm、数值孔径 0.24。

2501_91855190的博客 2676

Effective C++中文版 2nd Edition

下载 EffectiveC++ 2ed 中文版目录(Contents) vii前言(Preface) xiii致谢(Acknowledgments. 中文版略) xvii导读(Introduction) 001改变旧有的C习惯(Shifting from C to C++) 013条款1:尽量以 const 和 inline 取代 #define 013Prefer const and inl

rabies的专栏 1152

系统安装、qt配置、安装pcie驱动

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 安装Linux系统指定:ununtu20.04并配置相关软件环境 前言 提示:这里可以添加本文要记录的大概内容: ununtu20.04、Qt 5.9.0、pcie驱动 提示:以下是本篇文章正文内容,下面案例可供参考 一、安装系统 制作系统盘(win10),在开机时按相应键进入BIOS,(华硕需要先改配置启动->CSM->开启->第一个选项选第一个或第二个),等待即可 进入后按照https://www.sysgeek.

weixin_44832804的博客 2204

5分钟搞定!用Cursor和.NET 9.0快速搭建串口通讯上位机(附VS Code插件配置)

本文分享了如何利用Cursor AI编程助手与.NET 9.0,在5分钟内快速构建一个功能完整的串口通讯上位机程序。通过自然语言描述需求,AI自动生成WinForms界面和核心代码,极大提升了硬件调试工具的定制开发效率。文章详细介绍了环境配置、AI协作编码、功能实现与调试的全过程。

weixin_28366353的博客 274

C++内存分配与对象构造的分离

摘自http://www.cnblogs.com/mengwang024/p/4408841.html 在C++中,我们基本用new(delete)操作符分配(释放)内存。new操作符为特定类型分配内存,并在新分配的内存中构造该类型的一个对象。new表达式自动运行合适的构造函数来初始化每个动态分配的类类型对象。即new表达式既分配了内存同时也构造了对象。 然而,我们一定会遇到这

lck32578的专栏 550

Labview界面多按钮控件的一种处理方法

当界面中存在多个按钮控件时候,此时如果逐个为每个控件添加事件条件则会显得较为麻烦,此处提供了一种对多控件进行批量处理的方法

miracleis的博客 2702

C++学习笔记(适合初学者和想要快速了解C++语法的人)

程序基本格式 #include&lt;iostream&gt; int main() { std::cout&lt;&lt;"HelloWorld"&lt;&lt;std::endl; return0; }       输入输出 //ostream(cout)输出流:往控制台写数据;istream(cin)输入流:从控制台读数据 std::cin&gt;&gt;a; std::ci...

小黄蓉的优快云博客专栏 640

PCL 直通滤波器【2026最新版】

PCL直通滤波器函数详解以及用于多字段滤波、强度滤波、获取某一时间范围内的点等高阶用法案例分享。博客长期更新,本文最近一次更新时间为:2026年3月11日。

点云侠的博客 40万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

如何一次看懂 Nudelta:NuPhy 改键工具 Nudelta 的 C++17 类体系与 HID Feature Report 通信层全解析

[![Nudelta 改键工具主界面:可视化重映射 NuPhy 键盘按键](https://raw.gitcode.com/gh_mirrors/nu/nudelta/raw/c7c43c9e47ac9ebfee04c76739009427ff8e8253/res/screencap.png?utm_source=gitcode_repo_files)](https://link.gitcode.

gitblog_00538的博客 291

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Effective C++目录中的C++编程条款

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34237596的博客 231

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C/C++笔试题(基础题)

为了便于温故而知新,特于此整理 C/C++ 方面相关面试题。分享,共勉。 (备注:各题的重要程度与先后顺序无关。不断更新中......欢迎补充) (1)分析下面程序的输出(* 与 -- 运算符优先级问题) 程序1:原题程序 1 #include&lt;iostream&gt; 2 using namespace std; 3 4 void main() 5 { ...

weixin_34090562的博客 566

知微传感Dkam系列3D相机SDK例程篇:连接多台相机实现串联触发

知微传感多相机串联触发采集数据

u012660296的博客 1122

JavaScript字符串元音计数的工程化实现与性能优化

字符串处理是前端与Node.js工程中的基础能力,其核心涉及字符访问、匹配算法、内存模型及运行时优化。理解`str[i]`与`charAt()`的性能差异、正则表达式回溯陷阱、`Set`哈希查找原理,本质是在掌握V8引擎对字符串的底层抽象与优化路径。这些技术价值直接映射到内容审核、语音质量分析、多语言搜索等真实场景——例如用元音密度判断TTS输出合理性,或通过Unicode安全匹配拦截绕过敏感词。本文聚焦JavaScript中元音统计这一典型任务,深入`algorithms`设计逻辑与`regular ex

Coding 582

君正Magik平台ResNet18 ONNX INT8量化实战指南

嵌入式AI模型部署的核心在于将高精度算法适配至边缘芯片的硬件约束。ResNet18作为轻量级骨干网络,其量化本质是平衡精度损失与推理效率的关键技术;ONNX作为跨框架中间表示,在君正Magik平台上需深度适配BPU指令集、LPDDR4x带宽及INT8/FP16混合精度特性。量化过程并非简单参数压缩,而是涉及算子替换、BN融合、NHWC格式绑定、FC权重转置及残差连接独立缩放等底层工程实践。该技术路径广泛适用于车牌识别、工业质检等国产RISC-V边缘AI落地场景,是实现低功耗(<1.2W)、高实时性(<70m

weixin_34205826的博客 341

基于STM32MP157的智能语音智慧家庭

首先将/home/root 下拷贝过来的压缩包给移动到 /usr/share/fonts 目录下。到这边后续就不需要操作了,直接运行qt程序就已经是中文了,乱码问题已经解决。在/etc/profile.d/qt-eglfs.sh中添加如下几行代码。然后将这个文件移动到/usr/share/fonts路径下面。此时在我们的开发板当中查看一下,就可以看见文件了。进入 /user/share/fonts 目录下。拷贝方法是使用scp命令。

qq_44672308的博客 67

REA reverse-engineer-anything 逆向技能装进 AI 助手:从一条命令到看懂二进制

REA(reverse-engineer-anything)是面向 AI 编码助手的开源逆向工程工具包:一条 setup 命令,把逆向工作流接进 Claude Code、Cursor、Codex。它能在没有源码的情况下,从原生二进制、JavaScript/Electron、.NET 程序集、Android APK 到固件追踪功能实现,并给出带证据的结论。想让助手不只会写代码、还会读二进制、追证据,

gitblog_00801的博客 322

【DIY系列:Java虚拟机】第45篇:类加载器——JVM 的“搬运工“

本文详解jvmgo中类加载器的实现:通过LoadClass的缓存机制提升性能,采用三步流程——读取字节流、定义类并递归解析超类/接口、链接(验证与准备)。重点剖析defineClass中类映射写入时机的陷阱、递归加载的收敛逻辑及验证阶段空实现的风险。对比真实JVM的双亲委派模型与数组类特殊性,揭示类加载的核心设计原则。

xyghehehehe的专栏 529

OpenViking × cuVS GPU 向量索引集成:初步基准测试结果全解读

> 本文是对 OpenViking 将 NVIDIA cuVS(GPU 向量索引库)接入其本地向量检索引擎后的首次工程化基准测试报告的完整解读。报告记录了在 NVIDIA H20 单卡上,cuVS GPU 暴力精确检索(brute-force)与 CAGRA 近似检索相对 OpenViking 原生 CPU flat-index 的构建耗时、GPU 显存占用、Recall@K、单查询延迟、批吞吐与

gitblog_00163的博客 479
上一篇: 【C++】023、移动语义&深拷贝
下一篇: 【C++】025、内存对齐
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值