迷途指针 new delete
编程中有一种很难发现的错误是迷途指针。迷途指针也叫悬浮指针、失控指针,是党对一个指针进行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相关推荐
- 迷途指针,从百度百科上摘抄的,语言很幽默
迷途(stray)指针,也被称为野(wild)指针或悬浮(dangling)指针,是指将delete 用于指针(从而释放它指向的内存),但没有将它设置为空时引发.如果随后你在没有重新赋值的情况下使用该 ...
- 复制构造函数的用法及出现迷途指针问题
复制构造函数利用下面这行语句来复制一个对象: A (A &a) 从上面这句话可以看出,所有的复制构造函数均只有一个参数,及对同一个类的对象的引用 比如说我们有一个类A,定义如下: ? 1 ...
- 野指针 悬垂指针 迷途指针
一.悬垂指针 当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称悬垂指针(也叫迷途指针).若操作系统将这部分已经释放的内存重新分配给 ...
- C++的指针的坑:“new[]的指针需要delete[]”和“子类指针可以转父类指针”的两条规则成功的冲突到了一起...
原文地址:http://www.cppblog.com/vczh/archive/2013/04/27/199765.html posted on 2013-04-27 17:24 陈梓瀚(vczh) ...
- C++迷途指针(dangling pointer)与野指针
1.野指针是指没有初始化的指针,如下: #include<stdio.h> int main(int argc,char * argv[]){int *p;return (*p&0 ...
- 静态类对象指针需要delete吗 vc_C/C++真的有那么难学吗?其实不然,无非是你没有找对方法罢了...
背景 随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者.而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务 ...
- delete指针之后应该赋值NULL
首先,C++标准规定:delete空指针是合法的,没有副作用. 但是,delete p后,p并不会自动被置为NULL 问题来了,对一个非空指针delete后,若没有赋NULL,若再次delete的话, ...
- 虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?...
五条基本规则: 1.如果基类已经插入了vptr, 则派生类将继承和重用该vptr.vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的 ...
- C++ 学习笔记(19)new/delete表达式、定位new、typeid、dynamic_cast、type_info、枚举类型、成员函数指针、union、位域、volatile限定符、链接指示
C++ 学习笔记(19)new/delete表达式.定位new.typeid.dynamic_cast.type_info.枚举类型.成员函数指针.union.位域.volatile限定符.链接指示 ...
- 常引用、常量指针、指针常量、指向常量的常指针、空指针与野指针解释
1.一.基础知识 引用并非对象 引用必须初始化 引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起 类型要严格匹配 int &a = 10; //错误:引用类型的初始值必须是 ...
最新文章
- Print All JVM Flags
- NOIP2018提高组比赛总结
- MongoDB学习笔记~管道中的分组实现group+distinct
- SQL进阶,子查询与窗口函数
- 计算机毕业设计源码分享双鱼林,计算机毕业课程设计论文源码-057双鱼林asp教务选课信息系统...
- oracle 定位行锁,oracle 的for update行锁语法
- ACM时间复杂度及算法的选择分析
- 数字孪生城市可视化运营管理系统 智慧城市解决方案
- linux服务器生成密钥后无法登陆,securecrt用密钥安全登陆服务器
- PID参数自整定库之一:继电反馈整定算法
- linux更改文件系统格式,只安装Linux系统,把硬盘全部格式化成Linux文件系统
- 2008服务器远程开启,windows server 2008 r2中开启远程桌面的方法
- 大数据运维架构师培训(4):Oozie,Flume,Sqoop,Azkaban,Ranger
- window子对象的详细介绍 _@jie
- r1音箱原生系统更改服务器,某讯R1音响——版本升级和安装DLNA细致教程
- pacemaker+corosync 搭建一主两从PG集群
- HBase 集成 Phoenix 构建二级索引实践
- gcc 查看默认的编译标准
- linux 无线网卡不好用,linux deepin 无线网卡不能用,打不开
- 奥比中光Astra Pro Demo示例
热门文章
- PHP 删除文件,文件下的目录
- 六石管理学:遇到问题先记录分析,再找人帮忙
- ProGuard:类混淆,类的指定函数保留
- 编译OpenJDK8:configure: Could not compile and link with freetype. This might be a 32/64-bit mismatch.
- VS2017社区版离线下载办法
- 解决办法:/usr/bin/ld: 找不到 -lstdc++
- 工作上不要遮掩,如实回答,什么样的借口可以接受
- 天人感应是常见的自然规律
- 手机输入法并一不一定要横向充满
- java实例成员与类成员区别_Java之实例成员与类成员