delete之后还需要置NULL吗?

delete指针后应该将指针赋值为NULL 一般来说,执行语句: int *p = new int(1); delete p; 之后,指针指向的内存空间已经释放了,该指针已经没有“实权”了,但是该指针还是存在,并没有消失,而且指向的地址也没有改变,这时对这个指针的任何操作都是危险的,很容易发生程序错误,这时候的p就是一个野指针,比如再次执行delete p操作,会使程序崩溃。良好的习惯是在delete之后,随后将该指针置NULL,如下: int *p = new int(1); delete p; p = NULL; 这时候发生delete p操 阅读详情

目录

1 问题

2 解答

2.2 实验

2.3 为什么会这样?

3 结论


1 问题

对指针变量进行delete操作后,还需要置NULL吗?如下面的常见操作:

node* temp = tree.get_root();
.....

delete temp;
temp = NULL;

最后的一句temp = NULL;是否多余?

2 解答

答案是,这样做是必要的。

2.2 实验

如下面的代码:

ERIC_TEST(b_tree, delete_char_array)
{
    char *array = new char[10];
    snprintf(array,10,"hello");
    printf("%s\n", array);

    // delete
 delete array;

    // check
 if(array != NULL){
        printf("array != NULL\n");
    }
}

运行的结果是:

hello
array != NULL

2.3 为什么会这样?

这个与直觉相悖的。delete就意味着要将资源释放了,那么指向这块资源的变量,自然失去了意义。 置为NULL是个很自然的步骤。但是,C++为什么没有实现呢?

原因是,有时候要置为NULL对象不存在。考虑右值的例子。如:

int* f();
int* p;
//...
delete f(x);
delete p+1;

在上面的例子中,delete的操作对象(operand)是右值,右值的特征就是,过了所在行, 就不存在了。所以,直觉里delete的两个操作:

  • 释放所指向的资源
  • 将变量置为NULL(对右值无法实现) 第二个是无法实现的。

所以C++的标准里,并没有规定delete必须得将其operand置为NULL。具体到各家的编译器实现,如GCC/VC,也都没有置为NULL的操作。——“实验”一节的代码,在GCC与VC下编译,运行结果无差别。

3 结论

方便保险起见,delete之后,需要将指针变量置NULL。

Google Earth Engine(GEE)——将sentinel - 2影像所有波段重采样到10m分辨率 (resample 和 projection的使用) 影像重投影是将一个影像从一个坐标系投影到另一个坐标系的过程。这通常涉及到将像素从一个平面坐标系变换到另一个平面坐标系。这可以用于许多应用中,例如建立数字高程模型(DEM)和地图制图。影像重投影通常需要进行数学计算,包括转换矩阵和插值算法,以确保像素值的准确性和精度。这次我们将对哨兵2好数据中20m分辨率的波段,重采样到10m分辨率中,然后同一参与计算。 阅读详情

相关推荐

浪涌电流测试仪的工作原理

浪涌电流脉冲形成的开始由同步电路 13 确定,该同步电路 13 发送命令以打开和第二开关 10 和 11,向发生器 14 发送控制命令以生成被测半导体器件 5 的控制信号和参考信号整形器 9 的触发脉冲。电流源的功率输出并联连接,以对流经被测半导体样品的电流求和。此外,使用数字控制扩展了测试仪的功能,能够产生各种形状的电流脉冲,例如梯形电流脉冲,以估计被测晶闸管的导通状态扩展时间。由于晶体管3的栅极是连接的,并且平衡电阻4包含在晶体管3的源中,因此通过每个晶体管3的电流脉冲大致相同,并重复参考信号的形状。

Jesse0257的博客 1255

C++中指针free/delete后为什么要刻意指向NULL

这是因为指针p被free/delete之后,没有置为NULL(最好加一句p=NULL;),经常性的我们会以为p是个合法的指针。他们只是把指针指向的内存给释放掉,并没有把指针本身干掉,此时指针指向的就是“垃圾”内存。所以我们应该在释放完之后,立即将指针置为NULL,防止出现乱指的情况。野指针是指向不可用内存区域的指针(非法内存,垃圾内存)。野指针不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为if语句能够判断。但是野指针是很危险的,if不能判断一个指针是正常指针还是野指针。...

Rolandxxx的博客 2761

【高清照片】深圳光博会看PCIe Over Fibre 实现方案

本文分析了PCIe over Fibre技术及其在数据中心的应用前景。该技术通过光纤延伸PCIe总线,解决了传统铜缆距离限制问题,支持跨机架资源池化。目前主要有两种实现方式:CDFP混合光缆方案和Retimer转接卡方案,各有优缺点。文章还探讨了CDFP接口的现状、低速信号传输解决方案,以及PCIe速率与光通信发展的对应关系。最后对比了PCIe光缆与以太网光缆的关键差异,指出PCIe光互连在协议透明度和边带信号处理上的特殊要求。随着标准推进,PCIe over Fibre将成为数据中心扩展高带宽、低时延互连

Saniffer的博客 1383

指针delete后为什么要置空

转载: C++指针delete后还要置为null_热带巨兽的博客-优快云博客_delete指针后,需要置为null

qq_38409301的博客 1212

Python+AI能源管理实战:从电力负荷预测到智能调度的全流程开发

本系统展示了Python在能源管理领域的强大能力,通过AI技术实现了从预测到优化的智能决策闭环。随着碳中和目标的推进,智能能源系统将成为新型电力系统的核心大脑。📌 专业建议:系统部署需考虑网络安全防护,关键控制指令应设置多重验证机制!关注我的优快云账号获取能源系统安全最佳实践~下期预告:我们将探索Python在智慧医疗中的应用,开发基于多模态数据的智能诊断辅助系统。想提前获取代码?评论区留言"智慧医疗"获取GitHub源码链接!

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 624

图片数据爬取工具Image-Downloader的安装和使用

文章目录1、python安装2、下载chromedriver并配置3、下载phantomjs并配置.4、安装相关python库5、使用 安装包地址:https://github.com/sczhengyabin/Image-Downloader 下载: 方式一:打开cmd,输入: git clone https://github.com/sczhengyabin/Image-Downloader.git 方式二:打开网址 1、python安装 该数据爬取工具要求python>=3.5,由于

wxplol的博客 6672

C++中delete指针后,要将其赋值为NULL的具体原因

delete指针后,只是释放了指针指向的内存空间,但是指针还在,并且指向之前的地址。 举个例子: #include <iostream> using namespace std; int main() { int *p=new int; *p=3; cout<<"将3赋给p的地址后,指针p读取的值:"<<*p<<end...

c243311364的博客 6112

西门子S7-1200PLC PID_Temp工艺指令在恒温控制中的实战应用

本文详细介绍了西门子S7-1200PLC中PID_Temp工艺指令在恒温控制系统中的实战应用。从硬件选型、安全接线,到TIA Portal软件组态、编程及核心PID_Temp指令调用,手把手指导搭建系统。重点讲解了利用指令自带的预调节与精确调节功能进行PID参数自整定,最终实现高精度、低波动的温度控制,适用于塑料成型、食品烘烤等多种工业场景。

i1j2k的博客 234

C++之我见--delete指针

开篇之前温故一下关于指针的几个小点: 指针本身也是变量,特殊之处在于它是指向一个内存地址的变量 既然是变量,那么它在内存中也有地址 指针p本身地址:&p 指针p指向地址:p 指针p指向地址内值:*p delete指针 指针delete掉之后需要置NULL 甭管为什么,记住总没错。 下面解释下为啥? int *pp = new int; *pp = 1; cout &lt...

我爱我家 3358

Multisim 14.0实战:从零搭建可调幅多波形信号发生器(附仿真文件)

本文详细介绍了如何在Multisim 14.0中从零搭建一个可调幅多波形信号发生器,涵盖方波、三角波和正弦波的生成原理与实现步骤。通过核心电路架构解析、关键参数设计及Multisim实战操作,帮助电子工程学习者和硬件工程师掌握信号发生器的设计与调试技巧,并提供仿真文件供实践验证。

nokia的博客 1073

CentOS7环境下搭建 rsyslog 日志服务器,rsyslog+loganalyzer

1.系统环境部署 ip hostname 192.168.200.182 web 192.168.200.184 rsyslog-mysql 关闭防火墙、selinux、下载epel源 [root@web ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/f

sehn_的博客 3752

C++在delete指针之后是否要置为null

delete一个指针之后,只是回收指针指向位置的空间,而指针本身的值不变(也就是说还是指向那个地址的)。你需要手工将其赋值为NULL。 现在对于printf的反汇编代码不太熟悉,以后写个实例分析一下。

wuxinliulei的专栏 5520

S7-1200g2运动控制实战:从轴组配置到程序调试

本文详细介绍了S7-1200g2运动控制功能的实战应用,从轴组配置到程序调试的全流程。通过TIA Portal中的工艺对象配置,实现单轴、同步轴组等运动控制模型,并分享常见问题排查与性能优化经验,帮助工程师快速掌握中小型自动化设备的运动控制技术。

weixin_28698059的博客 587

C++指针delete后还要置为null

众所周知,最开始我们用new来创建一个指针,那么等我们用完它之后,一定要用delete将该指针删掉。但是,值得注意的是,难道就仅仅是删除这个指针这么简单的么?下面,我们用一个程序来说明这个问题:[cpp] view plain copy#include <iostream>  using namespace std;  int main()   {      int *p=new in...

qq_36570733的博客 3万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

delete对象后到底要不要将对象置为NULL

以下是我的一个美国同事丹尼尔对此的看法: Member pointers do NOT have to be set to NULL in a destructor. A destructor, as its name implies, destroys an object and the object can’t be accessed after that. So accessing any

IT江湖的刀光剑影 5263

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

new后的delete,用Null还是nullptr置空?

答案:null和nullptr都行,多数人都用null nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有二义性的问题. 个人见解:尽量采用nullptr置空。 1.可以避开了那些令人奇怪的函数重载决议,这不是它的唯一优势。 2.它也可以使代码表意明确,尤其是当涉及到与auto声明的变量一起使用时。 详解:EffectiveModernCppChinese/item8.md at master · kelthuzadx/EffectiveModernCpp

qq_38409301的博客 1093

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

char* char;基本类型的new、delete与malloc、free;delete 与free结束应该置NULL;

目录前言一、重点直出:1.new与delete2.malloc与free二、更多细节参考 前言 new与malloc 的细节; 一、重点直出: 对应关系如下: 1.new与delete char* temp2 = new char; delete temp2; temp2 = NULL; char* temp2 = new char[50]{'1'}; delete []temp2 ; temp2 = NULL; 初始化是为了后面都带上’\0’;否则是乱的数据,后面在结尾需要自己加上’\0’。

多丰富下自己呀 2209

delete 指针之后 ,只是释放了指针指向的内存空间,指针不会自动置为NULL,还有delete 遇到指针为NULL时不会调用析构函数

#include usingnamespace std; class A { public: A( void ) { cout

wangpeiyao5566的专栏 2154

C++中delete指针后将指针置0的作用

Qt学习之路2中访问网络的章节中有这样的代码: NetWorker::~NetWorker() { delete d; d = 0; } 其中d是一个指针。d = 0;的作用,参考百度知道: delete之后的指针指向一个不确定的位置,叫悬垂指针,如果后面不经意引用了,会导致程序崩溃。置0使其成为空指针,后面的程序可通过判断该指针是否为NULL来确定它是否有效。 更加全面的解...

随便写写 1392

C++中new 和 delete在类和结构体的使用

C++动态分配内存空间 : new 和 delete:https://blog.youkuaiyun.com/m0_37153702/article/details/77845269 C++中的new与struct:https://blog.youkuaiyun.com/yongan1006/article/details/7715990

Young_Fan 8471

on delete set null & on delete cascade

其面我们介绍了创建外键约束时如果使用oracle默认的创建方式,在删除被参照的数据时,将无法被删除,这一点在oracle9i中给了我们更多灵活的选择,我们可是使用on delete cascade和 on delete set null关键字来决定删除被参照数据时是否要将参照

6990

关于指针的delete

转载自C++指针delete之后还要置为null

qq_49968057的博客 412

指针delete之后赋值为null

1、现象 经常看到有些代码在delete之后赋值为null 2、原因 C++标准规定:delete空指针是合法的,没有副作用。 所以我们在Delete指针后赋值为NULL或0是个好习惯。对一个非空指针delete后,若没有赋NULL,若再次delete的话,会报错 ...

大AI时代,人性化的信息更加难得可贵 71

c++中的 delete

关于c++中的delete一直有几个问题比较迷惑,网上搜集了一些资料。记录下来。 1.delete p 之后为什么要 p=NULL; 首先,C++标准规定:delete空指针是合法的,没有副作用。 但是,delete p后,p并不会自动被置为NULL 问题来了,对一个非空指针delete后,若没有赋NULL,若再次delete的话,有可能出现问题。 如下代码 int *p = ne

viperlong的专栏 1552
上一篇: Git 打补丁-- patch 和 diff 的使用
下一篇: Linux dmesg命令
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值