zoukankan      html  css  js  c++  java
  • 迷途指针

      所谓迷途指针(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指向相同的内存地址。

  • 相关阅读:
    ① ts基础
    ⑦ 原型和原型链 作用域链
    ④ 小程序使用分包
    功能⑦ 小程序整合高德地图定位
    effective OC2.0 52阅读笔记(三 接口与API设计)
    effective OC2.0 52阅读笔记(二 对象、消息、运行期)
    effective OC2.0 52阅读笔记(一 熟悉Objective-C)
    perl的Getopt::Long和pod::usage ?
    安装你自己的perl modules
    Perl 之 use(), require(), do(), %INC and @INC
  • 原文地址:https://www.cnblogs.com/go-better/p/9084551.html
Copyright © 2011-2022 走看看