gtx1080 11gbps:删除一个指针之后可不要就跟着悲剧了啊……

来源:百度文库 编辑:偶看新闻 时间:2024/04/27 10:00:57

众所周知,最开始我们用new来创建一个指针,那么等我们用完它之后,一定要用delete将该指针删掉。但是,值得注意的是,难道就仅仅是删除这个指针这么简单的么?下面,我们用一个程序来说明这个问题:

12345678910111213141516171819#include using namespace std;int main() {    int *p=new int;     *p=3;    cout<<"将3赋给p的地址后,指针p读取的值:"<<*p<    delete p;    cout<<"删除空间后,指针p读取的值:"<<*p<    long *p1=new long;    *p1=100;    cout<<"创建新空间后,指针p中保存的地址:"<    cout<<"指向新空间的指针p1保存的地址:"<    *p=23;    cout<<"将23赋给p的地址后,指针p读取的值:"<<*p<    cout<<"将23赋给p的地址后,指针p1读取的值:"<<*p1<    delete p1;    return 0;}

       在上面这个程序中,我们在第8行就将指针p利用delete删掉了。但是,我们来看看程序的输出结果:

      对照着上面的程序,我们来分析一下这个输出。首先,我们在程序的第5行初始化了一个指针p。之后输出指针p读取的值。由于第6行的原因,程序肯定会输出3了。之后,我们在程序的第8行删除了这个指针p。但是我们惊奇的发现,在程序的第9行竟然可以输出指针p读取的值。我们不是已经把它删了么?其实不然,debug,上图:

      从监视窗口中,我们可以看见虽然程序的第8行已经将指针p删除了,但是在监视窗口中p仍然存在,只是*p所指向的值不再是原来的3了,而是一个随机数。这里就说明了一个非常重要的概念:我们在删除一个指针之后,编译器只会释放该指针所指向的内存空间,而不会删除这个指针本身。

      然后我们接着往下分析。在程序的第10行我们又创建了一个long型的指针p1。在12行与13行的输出中我们惊奇地发现,指针p保存的地址居然和指针p1保存的地址一模一样!这个就说明了指针p和指针p1都指向内存的同一个地方!!!出现这种状况的原因其实是由于编译器。编译器默认将释放掉的内存空间回收然后分配给新开辟的空间。所以在第11行由于我们新开辟了一个可以保存long型变量的空间并且由p1来指向它,那么这里的p1指向的其实就是在程序第8行释放掉的内存空间,即p指向的内存空间!所以,这就导致了两个指针同时指向同一个内存空间。这是多不安全的一件事情啊!要知道,我们是把指针p删了的啊!如果再重新对*p进行赋值操作,那么不是会连着*p1一起改动么?

      果然,让我们担心的事情出现了。我们明明在程序的第11行中定义了*p1的值为100,但是在输出上面,指针p1读取的值竟然也是23。这个原因就是因为野指针p造成的。我们可以看到,在程序的第14行我们将23赋给了*p。又由于p和p1指向的是同一块内存单元,所以在这里相当于也将p1所指向的内存单元中的值(原来是100),改成了23!这样必然会导致程序的出错!

       那么我们就不禁要问了,对于这种由于野指针造成的问题,有没有解决的方法呢?答案当然是有的了。我们只需要牢记下面这句话:

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

      我们来看一下在stdio.h中关于关键字NULL的定义:

123456789/* Define NULL pointer value */ #ifndef NULL#ifdef __cplusplus#define NULL    0#else#define NULL    ((void *)0)#endif#endif

      注意上面定义的第5行。这里其实就说明了NULL就是0。也就是说,我们在删除完指针p之后,一定要把它变成空指针!只有这样,才会杜绝上面程序中出现的野指针的错误。

p.s. 对于NULL的应用,我们不应该仅限于上面的方法,还可以应用NULL来判断指针是否初始化成功了,如下例if中的判断方法:

123456789101112131415161718192021#include using namespace std; int main(){    int *p=new int;    if (p==NULL)    {        //判断指针p是不是空指针,如果是空指针,那么程序在这里就应该报错        //报错的方法有很多,比如说返回一个ERROR值:        //return ERROR;    }     //判断了操作成功之后我们才能进行一系列的操作    //...     //用完指针p之后,一定要将其删掉。这样可以杜绝野指针的存在    delete p;    //删除指针p之后,一定要加上下面这句话,免得成为野指针    p=NULL;}

         好了,下次一定要记住,在分配空间给指针之后,一定要用NULL来判断一下是否成功了。然后在删除这个指针的时候,也要用NULL来赋给指针,杜绝成为野指针!

O(∩_∩)O哈哈~写完,收工~~~~

雏菊咋又是悲剧啊!我以为死一个就够了呢? 我删除了一个想螃蟹的播放器之后系统就没有声音了怎么办啊 系统被删了一个文件之后,开机蓝屏,却可看到鼠标指针,而其他没有反应?是怎么回来呀?急助! 下载了一个桌面主题,启动后发现不好就不用了,删除了之后,发现。。。。。 做了一个留言版?可上传之后就无法显示 做了一个留言版?可上传之后就无法显示 我无意卸载了一个软件,可之后……帮帮我啦!! 运行354,检验光盘过了之后,跟着进入了窗口,出现了三国无双4,跟着窗口就没了,回到桌面没反应? 为什么我家的狗狗喜欢听手机的铃声啊 ,它听了之后很烦的样子 然后就会跟着铃声的旋律一起吼 上上网,突然弹出一个对话框……之后上网就不好使了 第一次处女膜破了之后,血是跟着就流出来还是过一会儿再流出来 一个游戏下载之后,要更新,但不能删除再下载,且只要更新一次就不用再更新.可以使用.该如可去做? outlook中的一个问题,请高手看下,不是高手就不要看了…… 救急啊`~愁死我了`~read()之后文件指针傻了 T_T 我很怕跟他搞完后,他就不要我了,那我可怎么办啊 我的同学像个风子一样的可烦了一天到晚跟着我怎么办啊 我不小心删除了一个东西之后,隔不久就会弹出一个窗口,电脑又没了声音,谁可以帮我,请留下QQ 我在玩魔兽的时候鼠标指针就不动了 停在一个地方 我下了一个白猫清理软件,可它带病毒,所以我刚装上就删了,可在回收站里无法将其彻底删除,为什么? 我的卡巴斯基卸了之后,可是有一个shellex,dll文件无法删除啊?如何删除啊? 我的卡巴斯基卸了之后,可是有一个shellex,dll文件无法删除啊?如何删除啊? 电脑系统启动的时候,有些程序跟着启动了,有什么办法可以不要跟着启动? 机子上边有一个坏了的虚拟光区,右健属性卸载了从新启动之后就又出现了.请问如何彻底删除 我的机器经常出现找不到鼠标指针,有时候指针不动,可过一会儿就好了,是鼠标的问题还是系统的问题啊?