int* p = new int[5]; int *p = new int[5]();delete[] p; delete p;区别是什么?
int main() {int *p = new int[5]; // 分配包含5个整数的数组内存// 初始化数组元素for (int i = 0; i < 5; i++) {p[i] = i * 10;}// 试图使用 delete p; 来释放数组内存delete p;delete[] p;// 打印数组元素for (int i = 0; i < 5; i++) {std::cout << "p[" << i << "] = " << p[i] << std::endl;}return 0;
}
代码如上,在delete p;的时候会发生什么问题,又是什么原因导致的?
首先,需要知道delete在底层都做了什么:
-
调用析构函数:如果
p指向一个对象(而不是基本数据类型的数组),C++ 运行时将调用这个对象的析构函数。对于基本数据类型(如 int、float 等)或者数组,析构函数不会被调用,因为它们没有析构函数。 -
内存回收:
delete操作将释放p指向的内存块。这块内存之后可能被操作系统回收,或者留待将来重新分配。 -
清理内部管理信息:C++ 运行时维护了一些内部数据结构来管理动态分配的内存。
delete操作将更新这些数据结构,标记相应的内存块为“可用”
而int *p = new int[5];中的p是指向该数组首地址的指针,如果你是用delete p;其实只是做了:
1. 删除了p这个对象
2. 回收p所指向内存(数组首个元素)
3. 清理内部管理信息
所以,数组剩下的元素是没有被清理回收的,我用ide输出了结果,发现delete p的结果如下:
p[0] = 1490466881
p[1] = 5
p[2] = -720962155
p[3] = 305593618
p[4] = 40
都是一些奇怪的值,也能证明刚才提到的delete p所发生的的事情。
如果你分配了数组,要进行释放,使用delete[] p; p = nullptr;如下:
int main() {int *p = new int[5]; // 分配包含5个整数的数组内存// 初始化数组元素for (int i = 0; i < 5; i++) {p[i] = i * 10;}delete[] p;p = nullptr;// 打印数组元素for (int i = 0; i < 5; i++) {std::cout << "p[" << i << "] = " << p[i] << std::endl;}return 0;
}
那delete[] p;底层实现是怎么做的呢?以下:
-
查找数组大小:运行时使用
p指针回退到数组大小存储的位置,获取数组的大小。 -
调用析构函数:如果数组元素是类对象,并且有析构函数,运行时将为数组中的每个元素调用析构函数。运行时知道数组的大小,所以它可以正确地循环通过每个元素来调用析构函数。
-
内存回收:运行时释放整个数组占用的内存块,包括存储数组大小的那部分内存。
-
清理内部管理信息:运行时更新其内部数据结构,标记相应的内存块为“可用”。
那代码中还有一个问题,我们一般new会调用构造函数,代码如下:
int *p = new int[5];
int *p = new int[5]();
以上两个有什么区别呢?简单来说:
-
int *p = new int[5];- 不会初始化数组中的元素。拥有未定义的值,取决于内存初始状态。
- 必须在使用数组之前手动初始化每个元素。
-
int *p = new int[5]();- 会将数组中的每个元素初始化为0。
- “值初始化”(value-initialization)。当你在
new表达式后面加上一对空括号()时,触发值初始化。对于基本数据类型如int,初始化为0。 - 确保数组的每个元素都被初始化为一个确定的值,减少了出错。
大概是这些~,有帮助就点个赞吧!
相关文章:
int* p = new int[5]; int *p = new int[5]();delete[] p; delete p;区别是什么?
int main() {int *p new int[5]; // 分配包含5个整数的数组内存// 初始化数组元素for (int i 0; i < 5; i) {p[i] i * 10;}// 试图使用 delete p; 来释放数组内存delete p;delete[] p;// 打印数组元素for (int i 0; i < 5; i) {std::cout << "p[" &l…...
数据结构|基础知识定义
1.值传递、地址传递、值返回、地址返回 1> 值传递:普通变量作为函数参数传递是单向的值传递,只是将实参的值复制一份给形参变量,形参的改变不会影响实参的值,因为所在内存空间不同 如果传递的是地址,被调函数使用指…...
物联网AI MicroPython传感器学习 之 MFRC522 RFID射频IC卡感应模块
学物联网,来万物简单IoT物联网!! 一、产品简介 MFRC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片,其特点低电压、低成本、体积小的非接触式读写芯片。MFRC522支持MIFARE系列更高速的非接触式通信,双向数据…...
搭建ES集群
目录 前言 搭建ES集群 集群状态监控 分片备份 节点角色 脑裂问题 分布式存储 分布式查询 故障转移 前言 单机的ES做数据存储必然会面临两个问题:海量数据存储问题、单机故障问题 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard)&…...
Tomcat的日志接收文件catalina.out nohup.out说明
catalina.out用于接收如下情况的日志: catalina.out其实是tomcat的标准输出(stdout)和标准出错(stderr),这是在tomcat的启动脚本里指定的,如果没有修改的话stdout和stderr会重定向到这里。所以我们在应用里使用System.out打印的东西都会到这…...
手机ip地址切换后有什么影响
随着互联网的普及和人们对网络连接的需求不断增加,手机已经成为我们日常生活中不可或缺的一部分。而在使用手机的过程中,手机ip地址的切换也成为了许多用户需要注意的问题。虎观代理小二二将探讨手机ip地址切换后可能产生的影响。 手机ip地址的含义及作…...
C++ 赋值运算重载,const成员,取地址及const取地址操作符重载
C 赋值运算重载,const成员,取地址及const取地址操作符重载 1. 赋值运算符重载1.1 运算符重载1.2 赋值运算符重载1.3 前置/--和后置/--重载 2. const成员3. 取地址及const取地址操作符重载 所属专栏:C“嘎嘎" 系统学习❤️ 🚀…...
嵌入式Linux系统的闪存设备和文件系统学习纪要
嵌入式Linux系统的闪存设备和文件系统学习纪要 Linux下的文件系统结构如下: NAND Flash 是一种非易失性存储器(Non-Volatile Memory),常用于闪存设备和固态硬盘(SSD)中。以下是几种常见的 NAND Flash 种类&…...
android 8.1 disable unsupported sensor
如果device不支持某种sensor,可以在android/frameworks/base/core/java/android/hardware/SystemSensorManager.java里将其disabled掉。以disable proximity sensor为例。 public SystemSensorManager(Context context, Looper mainLooper) {synchronized(sLock) {if (!sNativ…...
二、类与对象(一)
1 面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。以洗衣服为例,通常洗衣服会经历以下过程: 而C是基于面向对象的,关注的是对象,…...
写给所有的程序员,或者努力生活的你。
朋友们,好好休息,意味着好好锻炼,好好睡觉,好好学习,学习可以是功利的,需要有规划的,有执行能力,有反馈奖励机制的,也可以无用之用方为大用(比如take shit的时…...
pytorch 笔记:GRU
1 介绍 对于输入序列中的每个元素,每一层都计算以下函数: ht 是t时刻 的隐藏状态xt 是t时刻 的输入ht−1 是 t-1时刻 同层的隐藏状态或 0时刻 的初始隐藏状态rt,zt,nt 分别是重置门、更新门和新门。σ 是 sigmoid 函数∗ 是 Hadamard 乘积。…...
Kubernetes - Ingress HTTP 升级 HTTPS 配置解决方案(新版本v1.21+)
之前我们讲解过 Kubernetes - Ingress HTTP 搭建解决方案,并分别提供了旧版本和新版本。如果连 HTTP 都没搞明白的可以先去过一下这两篇 Kubernetes - Ingress HTTP 负载搭建部署解决方案_放羊的牧码的博客-CSDN博客Kubernetes - Ingress HTTP 负载搭建部署解决方案…...
Verilog:写流水灯时遇到的问题
module flow_led(input sys_clk, //系统时钟50Mhz 周期0.02nsinput sys_rst_n, //系统异步复位,低电平有效output reg [3:0] led ); reg [24:0] cnt;//计数器计时0.5s250000000*0.02ns always(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)cnt <…...
操作系统第四章-存储器管理
4.1 内存的基本知识 4.1.1 逻辑地址和物理地址 逻辑地址又称为相对地址 物理地址又称为绝对地址 一. 逻辑地址 内存中有多个进程,相对地址是相对于进程的起始地址而言的地址. 二.物理地址 绝对地址是在整个内存下的地址 4.2 程序的装入和链接 引入:用户程序要在系统中运…...
org.springframework.cloud:spring-cloud-starter-openfeign:jar is missing详解
openfeign无法导入的问题 我感觉最近带的好几个新人在搭建springCloud基础框架的时候,会犯一个非常小的错误,导致进度卡住了。 这个错误就是Feign导入的错误: ‘dependencies.dependency.version’ for org.springframework.cloud:spring-c…...
Netty第一部
一、select和epoll原理分析 外设设备网卡、鼠标、键盘等通过总线写到内存中,中间就有DMA拷贝,操作系统怎么知道内存中有数据了,这就需要操作系统通过中断机制确定,如果有中断信号过来,cpu会首先打断用户程序执行&…...
【设计模式】第11节:结构型模式之“装饰器模式”
一、简介 装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。…...
Spire.doc读取模板文档,并在书签处插入内容
在书签位置插入文字 //加载模板文档 Document document new Document(Server.MapPath("~/File/评价结果.doc")); //创建书签导航器 BookmarksNavigator bn new BookmarksNavigator(document); //添加一个section到文档 Section newSec document.AddSection(); …...
性能测试实施流程,5个阶段给老板安排的明明白白!
性能测试分为5个阶段,分别是【需求调研阶段】→【测试准备阶段】→【测试执行阶段】→【测试报告阶段】→【测试总结阶段】。 1、需求调研阶段 需求调研分为两个步骤进行:需求调研、需求分析 需求调研 需求调研工作由性能测试实施人员牵头负责&#…...
炉石传说脚本:智能游戏自动化助手的完整使用指南
炉石传说脚本:智能游戏自动化助手的完整使用指南 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 还在为炉石传说重复性的日常任务感到疲惫吗…...
如何5分钟搭建暗黑破坏神2存档编辑器:终极可视化解决方案指南
如何5分钟搭建暗黑破坏神2存档编辑器:终极可视化解决方案指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑破坏神2复杂的存档编辑而烦恼吗?想要自由调整角色属性却无从下手?d2s-…...
如何在Windows上轻松查看和转换iPhone HEIF图片:HEIF实用工具指南
如何在Windows上轻松查看和转换iPhone HEIF图片:HEIF实用工具指南 【免费下载链接】HEIF-Utility HEIF Utility - View/Convert Apple HEIF images on Windows. 项目地址: https://gitcode.com/gh_mirrors/he/HEIF-Utility HEIF Utility是一款专为Windows用户…...
注释覆盖率从42%→91%仅用8小时,DeepSeek R1/R2模型注释优化全链路实操,
更多请点击: https://kaifayun.com 第一章:注释覆盖率跃升的工程价值与DeepSeek模型适配性洞察 注释覆盖率并非代码“装饰”,而是可量化的知识沉淀密度指标。当函数级注释覆盖率从32%提升至89%,CI流水线中PR评审平均耗时下降41%&…...
DeepSeek LeetCode 2612. 最少翻转操作数 Java实现
解题思路LeetCode 2612「最少翻转操作数」是一个图论 BFS 最短路径问题:把数组每个位置看作图中的一个节点,每次翻转操作相当于在当前节点到下一节点之间连一条权重为 1 的边。由于所有边的权重相等,BFS 是求解最短路径的标准算法。---Step 1…...
别再死记硬背了!用UE5动画蓝图状态机做个“开关门”交互,5分钟搞懂运行流
用UE5动画蓝图状态机实现智能门交互:从理论到实战第一次接触虚幻引擎的动画系统时,那些抽象的概念总让人望而生畏。记得我刚开始学习UE4时,光是理解"状态机"这个概念就花了整整一周时间——直到我亲手实现了一个会自动开关的门。这…...
机器学习可持续性实践指南:从模型优化到绿色AI的工程落地
1. 项目概述:当机器学习遇见可持续性 在过去的十年里,我亲眼见证了机器学习从实验室的“黑科技”演变为驱动各行各业的核心引擎。从推荐系统到自动驾驶,模型的复杂度和规模呈指数级增长,随之而来的是一个我们无法回避的现实&#…...
3个技巧掌握跨平台资源下载神器:如何轻松获取微信视频号、抖音无水印内容?
3个技巧掌握跨平台资源下载神器:如何轻松获取微信视频号、抖音无水印内容? 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/…...
基于无监督机器学习与静止系参数的伽马射线暴物理起源分类研究
1. 项目概述与核心思路伽马射线暴(GRB)是天文学中最具挑战性的谜题之一。这些来自宇宙深处的剧烈爆炸,在几秒到几分钟内释放的能量,可能超过太阳一生释放的总和。长久以来,我们一直试图回答一个核心问题:这…...
3个创新方案:重新定义人体运动分析的开源工具
3个创新方案:重新定义人体运动分析的开源工具 【免费下载链接】opensim-core SimTK OpenSim C libraries and command-line applications, and Java/Python wrapping. 项目地址: https://gitcode.com/gh_mirrors/op/opensim-core OpenSim作为一个开源肌肉骨骼…...
