迷途指针

Posted _云深不知处

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迷途指针相关的知识,希望对你有一定的参考价值。

  所谓迷途指针(C中的野指针,C++中的迷途指针(失控指针或悬浮指针)),是指将delete 用于指针(从而释放它指向的内存),但没有将它设置为空时引发的。

  例如,当我们定义一个指针的时候:

1 void main()
2 {
3  int *p;
4 }

  p的值为0xcccccccc。也就是说,任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。这也就是为什么我们在指针一开始创建时就给它赋一个值总是没有错的。

  指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。free和delete只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main() {
 5     int *PInt=new int;
 6     *PInt=10;
 7     cout<<PInt<<endl;
 8     cout<<"*pInt:"<<*PInt<<endl;
 9     delete PInt;
10 //    PInt= NULL;//如果没有这句,PInt就成了迷途指针
11 
12     int *PLong=new int;
13     cout<<PInt<<endl;
14     cout<<PLong<<endl;
15     *PLong=90000;
16     cout<<"*PLong:"<<*PLong<<endl;
17 
18     *PInt=20;//再次使用PInt,如果是迷途指针则会出现未知错误,加了PInt= NULL则直接会报错(至少知道是错了)。(delete过的指针不应该再使用)
19 
20     cout<<"*PInt:"<<*PInt<<endl;
21     cout<<"*PLong:"<<*PLong<<endl;
22 
23     delete PLong;
24 
25     return 0;
26 }

 

以上程序输出结果为:

0x7f9330c026e0
*pInt:10
0x7f9330c026e0
0x7f9330c026e0
*PLong:90000
*PInt:20
*PLong:20

  可以看到PInt在删除之前是0x7f9330c026e0,删除之后还是0x7f9330c026e0,并且和PLong指向相同的内存地址。

以上是关于迷途指针的主要内容,如果未能解决你的问题,请参考以下文章

Use-After-Free

更新:C++ 指针片段

片段中的 EditText 上的空指针异常 [重复]

深层复制构造函数--初识

片段中的空指针异常

TCP迷途