博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
delete指针以后应赋值为NULL
阅读量:6001 次
发布时间:2019-06-20

本文共 1541 字,大约阅读时间需要 5 分钟。

 

delete p后,只是释放了指针中存放的地址中的内存空间。但是指针变量p仍然存在(即指针p本身所占有的内存),且p中存放的地址还是原来的地址。

例如:

  对一个非空指针delete后,若没有将p赋为NULL,若再次delete的话,会出现问题。

  如下代码:

#include 
int main(){ int* p = new int(3); delete p; delete p; return 0;}

ubuntu14.04中使用g++进行编译无问题,但运行时报错如下:

意思就是对同一指针变量进行了两次释放内存的操作,这是不合法的。

因为第一次释放后,指针p指向的那块区域已经变为不可访问区域了,再执行一次delete p,试图对一块不可访问的区域进行释放,这是不合法的。

将其改为:

#include 
int main(){ int* p = new int(3); delete p; p = NULL; delete p; return 0;}

则编译和运行都没有问题,因为C++保证delete值为NULL的指针是安全的。

 ///

具体的说明如下:

还是先看代码:

1 /* 2 *Compile Environment:linux ubuntu14.04.5 g++ 3 *Author: mengjia 4 *Date:20180520 5 **/ 6 #include 
7 using namespace std; 8 int main() 9 {10 int *p = new int;11 *p = 3;12 cout << "将3赋给p的地址后,指针p读取的值:" << *p << endl;13 cout << "删除空间前,指针p中存放的地址:" << p <

 

输出结果为:

第13第15行中可以看到,delete指针p前后,p中存放中地址并未改变。这就说明一个非常重要的结论:

delete一个指针后,编译器只是释放了指针中存放的地址中的内存空间,但p中存放的地址还是原来的地址。

在程序的第18行,创建了一个long型的指针p1,在20和21行的输出中发现,指针p保存的地址居然和指针p1保存的地址一毛一样。说明指针p和指针p1都指向内存的同一个地方。出现这种状态是因为编译器默认将释放掉的内存空间回收然后分配给新开辟的空间。所以18行,当开辟一个可以保存long型变量的空间并且由p1来指向它时,分配的空间为p指向的内存空间。

如此,将导致两个指针同时指向同一内存空间。这在C++中是非常忌讳的。

如上,在程序中定义了*p1 = 100;而后再操作p,使*p = 23;而后读取p1指向的内存中的值,变为了23。这就会使得已经delete的指针,若操作不当,会影响到程序的其它指针。这种情况就是由于野指针p造成的。

要避免这种情况的发生,解决办法就是:

在删除一个指针之后,一定要将该指针设置成空指针,即在delete p之后,要加上: p = NULL

 

补充说明:

请注意程序中第15行和16行的注释,这段程序在vs2017上是编译不通过的。原因就如注释所言,vs2017对其进行了优化,delete之后,让p的指向改变了,改变为指向一个不可访问的地址,使得之后如果有任何*p相关的操作,都会直接报错。其目的,我觉得就是保证在源头断绝,不让出现野指针的情况。

但这种依赖于编译器的优化,对我们理解C++并没有好处。

转载地址:http://dgbmx.baihongyu.com/

你可能感兴趣的文章
ES 自动恢复分片的时候不恢复了是磁盘超过了85%,然后不恢复了 ES可以配置多个数据目录...
查看>>
linux查杀病毒的几个思路
查看>>
宽带速度
查看>>
构建之法阅读笔记5
查看>>
Android判断网络连接状态
查看>>
js常用的函数库
查看>>
Sqlserver 数据库安全
查看>>
netstat命令简单使用
查看>>
Python标示符命名规则
查看>>
SSL certificate problem unable to get local issuer certificate解决办法
查看>>
20145209 刘一阳 《网络对抗》实验四:恶意代码分析
查看>>
个人学期总结
查看>>
CodeForces 985E Pencils and Boxes
查看>>
为什么Elasticsearch查询变得这么慢了?
查看>>
node.js中使用http模块创建服务器和客户端
查看>>
Away3D基础教程(六):支持双面交互的PlaneGeometry
查看>>
(十五)Centos之安装jdk
查看>>
RISC-V: custom instruction and its simulation(转)
查看>>
HDU 5366 The mook jong
查看>>
Unity ScriptableObject自定义属性显示
查看>>