编程中有一种很难发现的错误是迷途指针。迷途指针也叫悬浮指针、失控指针,是党对一个指针进行delete操作后——这样会释放它所指向的内存——并没有把它设置为空时产生的。而后,如果你没有重新赋值就试图再次使用该指针,引起的结果是不可预料的。

空指针和迷途指针的区别?

当delete一个指针的时候,实际上仅是让编译器释放内存,但指针本身依然存在。这时它就是一个迷途指针。

当使用以下语句时,可以把迷途指针改为空指针:

myPtr=0;

通常,如果在删除一个指针后又把它删除一次,程序就会变得非常不稳定,任何情况都有可能发生。但是如果你只是删除了一个空指针,则什么事都不会发生,这样做非常安全。

使用迷途指针或空指针(如果myPtr=0)是非法的,而且有可能造成程序崩溃。如果指针是空指针,尽管同样是崩溃,但它同迷途指针的崩溃相比是一种可预料的崩溃。这样调试起来会方便得多。

例如,

#include<iostream>
#include<new>
using namespace std;typedef unsigned short  int USHORT;int main()
{USHORT *pInt=new USHORT;*pInt=10;cout<<*pInt<<endl;delete pInt;//pInt=0;long *pLong=new long;*pLong=90000;cout<<"*Plong: "<<*pLong<<endl;*pInt=20;cout<<"*pInt: "<<*pInt<<endl;cout<<"*pLong: "<<*pLong<<endl;delete pLong;
}

此时运行结果:

*pInt还是指向原来的内存,因此将pLong的数据修改了,但是结果是错误的而并没有保存。。

加入将pInt=0;这句加上,此时运行结果直接报错,因为pInt指向空指针,不能访问空指针。

C++中已经有了malloc/free,为什么还需要new/delete?

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任何强加于malloc/free。

因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理和释放内存工作的运算符delete。new/delete不是库函数,而是运算符。

迷途指针 new delete相关推荐

  1. 迷途指针,从百度百科上摘抄的,语言很幽默

    迷途(stray)指针,也被称为野(wild)指针或悬浮(dangling)指针,是指将delete 用于指针(从而释放它指向的内存),但没有将它设置为空时引发.如果随后你在没有重新赋值的情况下使用该 ...

  2. 复制构造函数的用法及出现迷途指针问题

    复制构造函数利用下面这行语句来复制一个对象:   A (A &a) 从上面这句话可以看出,所有的复制构造函数均只有一个参数,及对同一个类的对象的引用 比如说我们有一个类A,定义如下: ? 1 ...

  3. 野指针   悬垂指针   迷途指针

    一.悬垂指针 当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称悬垂指针(也叫迷途指针).若操作系统将这部分已经释放的内存重新分配给 ...

  4. C++的指针的坑:“new[]的指针需要delete[]”和“子类指针可以转父类指针”的两条规则成功的冲突到了一起...

    原文地址:http://www.cppblog.com/vczh/archive/2013/04/27/199765.html posted on 2013-04-27 17:24 陈梓瀚(vczh) ...

  5. C++迷途指针(dangling pointer)与野指针

    1.野指针是指没有初始化的指针,如下: #include<stdio.h> int main(int argc,char * argv[]){int *p;return (*p&0 ...

  6. 静态类对象指针需要delete吗 vc_C/C++真的有那么难学吗?其实不然,无非是你没有找对方法罢了...

    背景 随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者.而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务 ...

  7. delete指针之后应该赋值NULL

    首先,C++标准规定:delete空指针是合法的,没有副作用. 但是,delete p后,p并不会自动被置为NULL 问题来了,对一个非空指针delete后,若没有赋NULL,若再次delete的话, ...

  8. 虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?...

    五条基本规则: 1.如果基类已经插入了vptr, 则派生类将继承和重用该vptr.vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的 ...

  9. C++ 学习笔记(19)new/delete表达式、定位new、typeid、dynamic_cast、type_info、枚举类型、成员函数指针、union、位域、volatile限定符、链接指示

    C++ 学习笔记(19)new/delete表达式.定位new.typeid.dynamic_cast.type_info.枚举类型.成员函数指针.union.位域.volatile限定符.链接指示 ...

  10. 常引用、常量指针、指针常量、指向常量的常指针、空指针与野指针解释

    1.一.基础知识 引用并非对象 引用必须初始化 引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起 类型要严格匹配 int &a = 10; //错误:引用类型的初始值必须是 ...

最新文章

  1. Print All JVM Flags
  2. NOIP2018提高组比赛总结
  3. MongoDB学习笔记~管道中的分组实现group+distinct
  4. SQL进阶,子查询与窗口函数
  5. 计算机毕业设计源码分享双鱼林,计算机毕业课程设计论文源码-057双鱼林asp教务选课信息系统...
  6. oracle 定位行锁,oracle 的for update行锁语法
  7. ACM时间复杂度及算法的选择分析
  8. 数字孪生城市可视化运营管理系统 智慧城市解决方案
  9. linux服务器生成密钥后无法登陆,securecrt用密钥安全登陆服务器
  10. PID参数自整定库之一:继电反馈整定算法
  11. linux更改文件系统格式,只安装Linux系统,把硬盘全部格式化成Linux文件系统
  12. 2008服务器远程开启,windows server 2008 r2中开启远程桌面的方法
  13. 大数据运维架构师培训(4):Oozie,Flume,Sqoop,Azkaban,Ranger
  14. window子对象的详细介绍 _@jie
  15. r1音箱原生系统更改服务器,某讯R1音响——版本升级和安装DLNA细致教程
  16. pacemaker+corosync 搭建一主两从PG集群
  17. HBase 集成 Phoenix 构建二级索引实践
  18. gcc 查看默认的编译标准
  19. linux 无线网卡不好用,linux deepin 无线网卡不能用,打不开
  20. 奥比中光Astra Pro Demo示例

热门文章

  1. PHP 删除文件,文件下的目录
  2. 六石管理学:遇到问题先记录分析,再找人帮忙
  3. ProGuard:类混淆,类的指定函数保留
  4. 编译OpenJDK8:configure: Could not compile and link with freetype. This might be a 32/64-bit mismatch.
  5. VS2017社区版离线下载办法
  6. 解决办法:/usr/bin/ld: 找不到 -lstdc++
  7. 工作上不要遮掩,如实回答,什么样的借口可以接受
  8. 天人感应是常见的自然规律
  9. 手机输入法并一不一定要横向充满
  10. java实例成员与类成员区别_Java之实例成员与类成员