迷途指针 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不是库函数,而是运算符。

 

时间: 2024-10-28 02:28:42

迷途指针 new delete的相关文章

C迷途指针

在计算机编程领域中,迷途指针,或称悬空指针.野指针,指的是不指向任何合法的对象的指针. 当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称迷途指针.若操作系统 将这部分已经释放的内存重新分配给另外一个进程,而原来的程序重新引用现在的迷途指针,则将产生无法预料的后果.因为此时迷途指针所指向的内存现在包含的 已经完全是不同的数据.通常来说,若原来的程序继续往迷途指针所指向的内存地址写入数据,这些和原来程序不相关的数据将被损坏,进而导

C++编程小心指针被delete两次_C 语言

在C++类中,有时候会使用到传值调用(即使用对象实体做参数),当遇到这种情况,可要小心了!尤其是当你所传值的对象生命周期较长,而非临时对象(生命周期段)的时候.来看看下面的情况: #include <iostream> using namespace std; class Text { private: char * str; public: Text(){str = new char[20]; ::memset(str,0,20); } void SetText(char * str) {

C迷途指针详解_C 语言

本文较为详尽的讲述了C语言的迷途指针,分析了其概念.原理与检测方法.分享给大家供大家参考.具体如下: 一般来说,在计算机编程领域中,迷途指针,或称悬空指针.野指针,指的是不指向任何合法的对象的指针. 当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称迷途指针.若操作系统将这部分已经释放的内存重新分配给另外一个进程,而原来的程序重新引用现在的迷途指针,则将产生无法预料的后果.因为此时迷途指针所指向的内存现在包含的已经完全是不同的数

C安全问题与指针误用

指针的声明与初始化 1.不恰当的指针声明 考虑如下的声明: int* ptr1, ptr2; // ptr1为指针,ptr2为整数 正确的写法如下: int* ptr1, *ptr2; 用类型定义代替宏定义是一个好的习惯,类型定义允许编译器检查作用域规则,而宏定义不一定会. 使用宏定义辅助声明变量,如下所示: #define PINT int* PINT ptr1, ptr2; 不过结果和前面所说的一致,更好的方法是使用下面的类型定义: typedef int* PINT; PINT ptr1,

我参考一下流程-各位前辈请教指针类问题

问题描述 各位前辈请教指针类问题 各位前辈,望能为我惑: 1.怎样编程读取一个TXT文件,并使其在屏幕上打印英汉双语 2.编写程序播放音频文件avi 解决方案 百度一下,网上很多.c语言可参考:http://zhidao.baidu.com/link?url=q6GAq97MB0K13rsPnOybpiWZvlbDPSYVBONPUdBz6e7InJRAHDKkVa1IA80l8XT5iGZUBkmNEDAC9emdlw1DVa 解决方案二: 一个关于dll导出类的对象指针的delete问题

c++类中指针、堆对象的问题

问题描述 c++类中指针.堆对象的问题 当调用析构函数释放对象时,不写delete语句释放成员指针所指的堆空间,那对象释放完之后,该指针是消亡了呢,还是仍然存在?如果存在,它又是指向哪里? 解决方案 指针本身是变量,当对象释放的时候,会把对象所有成员的值都释放.所以指针会消亡,但是那块堆内存还占用着,造成内存泄露! 解决方案二: 堆指针不delete,就会标记被使用,操作系统就不会回收,这样就会导致系统的内存泄漏. 解决方案三: 当对象释放的时候,会把对象所有成员的值都释放,所以指针会消亡,但是

c++-请教一个MFCDC类指针的问题

问题描述 请教一个MFCDC类指针的问题 请问下,在MFC里面用DC类,指针DC类和 正常DC类有什么区别呢? 解决方案 什么叫指针dc类.正常dc类. 指针和变量只是同一个事物的两种形式.没有区别. 建议你先复习下基本的C++语法. 解决方案二: 一个关于指针的问题一个关于指针的问题一个关于dll导出类的对象指针的delete问题

auto_ptr,shared_ptr 智能指针的使用

Q: 那个auto_ptr是什么东东啊?为什么没有auto_array?A: 哦,auto_ptr是一个很简单的资源封装类,是在<memory>头文件中定义的.它使用"资源分配即初始化"技术来保证资源在发生异常时也能被安全释放("exception safety").一个auto_ptr封装了一个指针,也可以被当作指针来使用.当其生命周期到了尽头,auto_ptr会自动释放指针.例如: #include<memory> using names

C++ new/delete相关知识点详细解析_C 语言

每个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区(free store)或堆(heap).C语言用一堆标准库函数malloc和free在自由存储区中分配存储空间,而C++则用new和delete表达式实现相同的功能. 一.new和delete创建和释放动态数组:数组类型的变量有三个重要的限制:数组长度固定,在编译时必须知道其长度,数组只在定义它的语句内存在.动态数组:长度固定,编译时不必知道其长度,通常是运行时确定:一直存在,直到程序显示释放它.