• 迷途指针,从百度百科上摘抄的,语言很幽默


    迷途(stray)指针,也被称为野(wild)指针或悬浮(dangling)指针,是指将delete 用于指针(从而释放它指向的内存),但没有将它设置为空时引发。如果随后你在没有重新赋值的情况下使用该指针,后果将是不可预料的:程序崩溃算你走运。

     

      这个程序故意创建了一个迷途指针:

     

      typedef unsigned short int USHORT;

     

      #include <iostream>

     

      int main ()

     

      {

     

      USHORT *pInt = new USHORT ;

     

      *pInt = 10 ;

     

      std::cout << "pInt:" << *pInt << std::endl ;

     

      delete pInt ;

     

      long *pLong = new long ;

     

      *pIong = 90000 ;

     

      std::cout << "*pLong:" << *pLong << endl ;

     

      *pInt = 20 ;

     

      std::cout << "pInt:" << *pInt << std::endl ;

     

      *pInt = 20 ;

     

      std::cout << "*pInt:" << *pInt << endl ;

     

      std::cout << "*pLong:" << *pInt << endl;

     

      delete pLong ;

     

      return 0 ;

     

      }

     

      输出:

     

      *pInt:10

     

      *pLong:90000

     

      *pInt:20

     

      *pInt :65556

     

      pInt声明为一个USHORT指针,并将其指向使用new分配的内存,将10存储到pInt指向的内存中,对指针使用delete后,pInt将成为一个迷途指针。

     

      接着声明了一个新的指针pLong,它指向new分配的内存,将90000存储到pLong指向的内存中。它指向的是pInt原来指向的内存块,带来麻烦的是 pInt = 20,它将20赋值到pInt原先指向的内存,(pInt被释放后不再指向任何合法的内存,它仍可能指向原来的内存块)将覆盖pLong指向的内存。这被称为重踏指针,它通常是使用迷途指针产生的不幸后果。

     

      总之。对指针使用delete后就不要再使用它。虽然这个指针仍指向原来的内存区域,但编译器可能已经将其他数据存储在这里。不重新给这个指针复制就再次使用它可能导致程序崩溃;更糟糕的是,程序可能表面上运行正常但是过不了几分钟后就崩溃了。这被称为定时炸弹,可不是好玩的。为了安全起见,删除指针后,

     

      把其设置为空.这样便解除了它的武装。

  • 相关阅读:
    volatile 关键字,你真的理解吗?
    kafka如何彻底删除topic及数据
    CentOS7 安装letsencrypt
    Qunar风控安全产品的探索之路
    乐观锁的实际应用
    前端打包报错内存溢出
    Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: /usr/lib/jvm/java11openjdkamd64/lib/libawt_xawt.so
    GitHud加速工具 devsidecar 安装
    linux系统命令行或shell里面设置终端title标题(适用与ubuntu,centos)[转]
    Sublime 搜索显示<binary>
  • 原文地址:https://www.cnblogs.com/wanghetao/p/2432036.html
Copyright © 2020-2023  润新知