博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用delete删除指针(转)
阅读量:5036 次
发布时间:2019-06-12

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

p所指的空间。 比如 int* p = new int(1); delete p; 就会在堆上分配一块内存,当作int类型使用,并赋值为1,将其地址储存在栈上的int*类型的p里。delete p会释放p所指向的内存。而这里p为一自动变量,其本身在程序退出其作用域时销毁。

用delete命令处理某个指针,说是把那个指针删除了是不正确的。

delete命令指示释放了那个指针原本所指的那部分内存而已。被delete后的指针p的值(地址值)并非就是NULL,而是随机值。

也就是被delete后,如果不再加上一句p=NULL,p就成了“野指针”,在内存里乱指一通。

如果在定义p的那个函数在delete了p后,没再调用p,就没什么问题,在这个函数结束后,p就会跟其它变量一样被消除。但若在那个函数里delete了p后,又没再给p赋值(地址值),再次调用p就危险了,因为这时p在内存里乱指,有可能指到一些重要地址,随时可能系统崩溃。

//p=NULL是个好习惯
//就像你蹲完厕所要洗手一样

《问题》危险的代码:

   int* p=new int(1);

   delete p;
   delete p;

 

探讨一:

   连续两次对同一个指针delete ,会造成严重的错误。编译器会检测出这样的错误吗?或许一些编译器会的,但别太过指望编译器。

 

探讨二:

   第一次delete后,p自动为空(NULL)了吗?不是的。

 

探讨三:

   在delete之前会自动检查p是否为空(NULL),如果为空(NULL)就不再delete了吗?确实是如此。

 

探讨四:

   删除为空(NULL)的指针是不会有任何问题的吗?确实是如此。

 

探讨五:

   #define SAFE_DELETE(p) delete (p); p = 0;

   这样就就万事大吉了吗?好像不是的。

   delete p+1;//在C++中是正确的

   SAFE_DELETE(p+1)将会导致错误

 

探讨六:

   没有好的方法解决重复释放这样的问题,只能靠程序员的细心了。

 

《结论》安全的代码:

   int* p=new int(1);

   delete p;
   p = NULL;

(1)delete 一次以后,p成了野指针,它作为地址的值还是有效地没还可以访问它以前指向的内存,不过那片内存被重新格式化了;

(2)p不等于NULL,用 if(p) 语句不能判断它指向的内存是否有效(此时它指向的内存无效,p本身有效);
(3)delete 一次以后,不能再次delete,否则会报错;
(4)此时如果误用p指针,仍然可以修改内存的值和从该处取出数值,但此时数据不受保护,该内存空间可能被重新被分配给别的变量;
(5)如果p指向的空间再次被new函数分配,即使是分配给别的指针,即使分配大小与原来不一样,p又恢复了效力,可以改变内存的值,甚至可以重新被delete,p的作用与新分配的指针一样;

转载于:https://www.cnblogs.com/romanten/p/6885216.html

你可能感兴趣的文章
hoj2353-Card Hands
查看>>
(还原本质)编程基础: 基本原理
查看>>
CTE初识
查看>>
快速WCF
查看>>
odoo xml 时间搜索条件
查看>>
git-git remote
查看>>
《人月神话》读书笔记 PB16060710冯富禹
查看>>
OWC11生成统计图案例
查看>>
块元素与行内元素的区别与相互转换
查看>>
软件测试基础配置
查看>>
F5 tmsh 批量操作
查看>>
leetcode 137. 只出现一次的数字 II(Single Number II)
查看>>
leetcode 1033. 移动石子直到连续(Moving Stones Until Consecutive)
查看>>
Yii2 运用 redis 服务
查看>>
git hub
查看>>
iOS 开发的一些效果 瀑布流
查看>>
JavaIO知识总结----温故才能知新02
查看>>
PHP中的可变参数函数和可选参数函数
查看>>
JAVA中使用JSONArray和JSONObject
查看>>
MeteoInfoLab脚本示例:FY-3A AOD HDF数据
查看>>