精华内容
下载资源
问答
  • C++野指针

    2020-03-27 19:37:18
    野指针不同于空指针,空指针是指一个指针的值为null,而野指针的值并不为null,野指针会指向一段实际的内存,只是它指向哪里我们并不知情,或者是它所指向的内存空间已经被释放,所以在实际使用的过程中,我们并不...

    野指针:

            野指针不同于空指针,空指针是指一个指针的值为null,而野指针的值并不为null,野指针会指向一段实际的内存,只是它指向哪里我们并不知情,或者是它所指向的内存空间已经被释放,所以在实际使用的过程中,我们并不能通过指针判空去识别一个指针是否为野指针。避免野指针只能靠我们自己养成良好的编程习惯,下面说说哪些情况下会产生野指针,以及怎样避免。

    1. 指针变量的值未被初始化: 声明一个指针的时候,没有显示的对其进行初始化,那么该指针所指向的地址空间是乱指一气的。如果指针声明在全局数据区,那么未初始化的指针缺省为空,如果指针声明在栈区,那么该指针会随意指向一个地址空间。所以良好的编程习惯就是在声明指针的时候就对其进行初始化,如果暂时不知道该初始化成什么值,就先把指针置空。

    void func()
    {
        int *ptr;    // 野指针
        if (ptr != nullptr) {
            ……do_somthing
        }
    }

     

     

    2.指针所指向的地址空间已经被free或delete:在堆上malloc或者new出来的地址空间,如果已经free或delete,那么此时堆上的内存已经被释放,但是指向该内存的指针如果没有人为的修改过,那么指针还会继续指向这段堆上已经被释放的内存,这时还通过该指针去访问堆上的内存,就会造成不可预知的结果,给程序带来隐患,所以良好的编程习惯是:内存被free或delete后,指向该内存的指针马上置空。

    void func()
    {
        int *ptr = new int[5];
        delete []ptr;
        // 执行完delete后,ptr野指针
    }

    3.指针操作超越了作用域:

    void func()
    {
        int *ptr = nullptr;
        {
            int a = 10;
            ptr = &a;
        } // a的作用域到此结束
    
    
        int b = *ptr;    // ptr指向a,a已经被回收,ptr野指针
    }

     

     

    展开全文
  • c++ 野指针

    2013-04-08 10:05:49
     对于指针确实有种莫名的恐惧感,从刚开始学习的时候就被老师灌输的概念是指针功能很强大,但是用得不够好,会有很大的副作用。什么叫用得够好?初学者谁都 不会用,那且不是都不能用了?如果都这样,指针

    原文出自 http://blog.163.com/cjt_0125@yeah/blog/static/9168290920106324540631/


    一、莫名的恐惧感

            对于指针确实有种莫名的恐惧感,从刚开始学习的时候就被老师灌输的概念是指针功能很强大,但是用得不够好,会有很大的副作用。什么叫用得够好?初学者谁都 不会用,那且不是都不能用了?如果都这样,指针都没人用了,还要指针做什么?

            陷入了上述困局的原因在于我们的这种莫名的恐惧感,指针如此之神秘,以至于如我一样大多数的人都望而生畏,无所适从,被迫放弃。

    二、野指针

           诚如当初老师的忠告一样, 指针是个很强大的工具,可是正因为它太强大,所以要操作它不是件易事。操作不当造成的野指针,甚至会引起系统死机等比较严重的后果。

            如果程序定义了一个指针,就必须要立即让它指向一个我们设定的空间或者把它设为NULL,如果没有这么做,那么这个指针里的内容是不可预知的,即不知道它 指向内存中的哪个空间(即野指针),它有可能指向的是一个空白的内存区域,可能指向的是已经受保护的区域,甚至可能指向系统的关键内存,如果是那样就糟 了,也许我们后面不小心对指针进行操作就有可能让系统出现紊乱,死机了。所以我们必须设定一个空间让指针指向它,或者把指针设为NULL,这是怎么样的一 个原理呢,如果是建立一个与指针相同类型的空间,实际上是在内存中的空白区域中开辟了这么一个受保护的内存空间,然后用指针来指向它,那么指针里的地址就 是这个受保护空间的地址了,而不是不可预知的啦,然后我们就可以通过指针对这个空间进行相应的操作了;如果我们把指针设为NULL,我们在头文件定义中的 #define NULL 0 可以知道,其实NULL就是表示0,那么我们让指针=NULL,实际上就是让指针=0,如此,指针里的地址(机器数)就被初始化为0了,而内存中地址为0 的内存空间……不用多说也能想象吧,这个地址是特定的,那么也就不是不可预知的在内存中乱指一气的野指针了。

      还应该注意的 是,free和delete只是把指针所指的内存给释放掉,但并没有把指针本身干掉。指针p被free以后其地址仍然不变(非NULL),只是该地址对应 的内存是垃圾,p成了“野指针”。如果此时不把p设置为NULL,会让人误以为p是个合法的指针。用free或delete释放了内存之后,就应立即将指 针设置为NULL,防止产生“野指针”。内存被释放了,并不表示指针会消亡或者成了NULL指针。(而且,指针消亡了,也并不表示它所指的内存会被自动释 放。)

    三 例说野指针

    例子1:

            首先请诸位看以下一段“危险”的C++代码:

    1. void function( void )  
    2. {  
    3.     char* str = new char[100];  
    4.     delete[] str;  
    5.     // Do something  
    6.     strcpy( str, "Dangerous!!" );  
    7. }         

            之所以说其危险,是因为这是一段完全合乎语法的代码,编译的时候完美得一点错误也不会有,然而当运行到strcpy一句的时候,问题就会出现,因为在这之 前,str的空间已经被delete掉了,所以strcpy当然不会成功。对于这种类似的情况,在林锐博士的书中有过介绍,称其为“野指针”。

     例子2:——指针初始化引出的问题

     对指针初始化时,引出的应该注意的问题小结:
    (1)先看例子:

    1. #include <iostream.h>  
    2.   
    3. void main()  
    4. {  
    5. char *p,*p1="hello first!";  
    6. while((*(p++) = *(p1++)) != 0);  
    7.   
    8. cout<<p<<endl;  
    9. }  

     错处:

    p定义时没有初始化,p是指向不定,是一个野指针。
    p++可能引用得空间为非法的。
     编译时不会出错,但运行时会造成程序崩溃。

    (2)把上面的p初始化为NULL

    1. #include <iostream.h>  
    2.   
    3. void main()  
    4. {  
    5. char *p=NULL,*p1="hello first!";  
    6. while((*(p++) = *(p1++)) != 0);  
    7.   
    8. cout<<p<<endl;  
    9. }

    也错:

    NULL表示没有任何指向。p++没有任何意义,运行时会造成程序崩溃。这里就应该想到不能对NULL的指针进行直接操作。

    (3)现在为p初始化为" ":

    1. void main()  
    2. {  
    3. char *p=" ",*p1="hello first!";  
    4.   
    5. while((*(p++) = *(p1++)) != 0);  
    6.   
    7. cout<<p<<endl;  

    还错:

    p指向的是一个const常量的内容,可以通过*(p++)形式引用该值,但是不能改变它指向const的内容。

    (4) 

    1. #include <iostream.h>  
    2. #include <string.h>  
    3. void main()  
    4. {  
    5.  char c[]="";  
    6.  char *p=c,*p1="hello first!";  
    7.  char *p_start=p;  
    8.  while((*(p++) = *(p1++)) != 0);  
    9.    
    10.  cout<<c<<endl;  
    11. }  

    问题:   

    此时数组是一系列的变量了,也就是p一有指向,二不是指向常量的而是指向变量的。所以按理应该行的。问题出在c太小,造成了数组越界,所以错掉!把c的大 小改来不比"hello first!"小就行了。

    5)对于的就想到用new来初始化了:

    1. #include <iostream.h>  
    2. #include <string.h>  
    3. void main()  
    4. {  
    5.  char *p,*p1="hello first!";  
    6.  p=new char;  
    7.  char *p_start=p;  
    8.  while((*(p++) = *(p1++)) != 0);  
    9.    
    10.  cout<<p_start<<endl;  
    11. }        

            现在就可以了,哈,不过,我认为在new时最好还是把它的大小给指出来,如new char[strlen(p1)+1];如果不指定大小,我想p++会指向一些已用得地址,而这些地址又不能随便改,就会造成诸如野指针样程序崩溃了。

    小结:对于前面的问题,不防这样来写:

    1. #include <iostream.h>  
    2. #include <string.h>  
    3. void main()  
    4. {  
    5.  char *p=NULL,*p1="hello first!";  
    6.  p=new char[strlen(p1)+1];  
    7.  //p=new char;            //觉得最好别这样 子,new char只相当于得到一个char对  
    8.  char *p_start=p;        //象,分配一个字符的空间。  
    9.  while((*(p++) = *(p1++)) != 0);  
    10.    
    11.  cout<<p_start<<endl;  
    12. }  

     造成野指针的原因

            1、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的默认值是随机的,它会乱指一气。
            2、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
            3、指针操作超越了变量的作用范围。这种情况让人防不胜防。

    五 正确使用指针

     通常避免野指针的办法是正确的使用指针   
    1.声明一个pointer的时候注意初始化为null :
              int*   pInt   =   NULL;   

    2.分配完内存以后注意ASSERT:
              pInt   =   new   int[num];   
              ASSERT(pInt   !=   NULL);   

    3. 删除时候注意用对操作符:
              对于new   int类型的,用delete   
              对于new   int[]类型的,用delete   []   

    4.删除完毕以后记得给他null地址:   
              delete   []   pInt;   
              pInt   =   NULL;   

    5.记住,谁分配的 谁回收,不要再一个函数里面分配local   pointer,送到另外一个函数去delete。   

    6.返回local   address是非常危险的,如必须这样做,请写注释到程序里面,免得忘记。  

    展开全文
  • C++ 野指针

    2010-09-10 10:10:00
    short* bufptr; short bufarray[20];...   代码第四行对没有初始化的野指针进行赋值是十分危险,可能造成程序崩溃。 代码第一行应为:short *bufptr=(short *)malloc(sizeof(short))

    short* bufptr;

    short bufarray[20];

    short var=0x20;

    *bufptr=var;

    bufarray[0]=var;

     

    代码第四行对没有初始化的野指针进行赋值是十分危险,可能造成程序崩溃。

    代码第一行应为:short *bufptr=(short *)malloc(sizeof(short))

    展开全文
  • 主要介绍了c++野指针的原理以及避免方法,帮助大家更好的学习和理解c++,感兴趣的朋友可以了解下
  • C/C++野指针

    2021-01-16 17:15:51
    C/C++野指针 野指针: 野指针不同于空指针,空指针是指一个指针的值为null,而野指针的值并不为null,野指针会指向一段实际的内存,只是它指向哪里我们并不知情,或者是它所指向的内存空间已经被释放,所以在实际...

    C/C++野指针

    野指针:
    野指针不同于空指针,空指针是指一个指针的值为null,而野指针的值并不为null,野指针会指向一段实际的内存,只是它指向哪里我们并不知情,或者是它所指向的内存空间已经被释放,所以在实际使用的过程中,我们并不能通过指针判空去识别一个指针是否为野指针。避免野指针只能靠我们自己养成良好的编程习惯,下面说说哪些情况下会产生野指针,以及怎样避免。

    1.指针变量的值未被初始化: 声明一个指针的时候,没有显示的对其进行初始化,那么该指针所指向的地址空间是乱指一气的。如果指针声明在全局数据区,那么未初始化的指针缺省为空,如果指针声明在栈区,那么该指针会随意指向一个地址空间。所以良好的编程习惯就是在声明指针的时候就对其进行初始化,如果暂时不知道该初始化成什么值,就先把指针置空。

    void func()
    {
    int *ptr; // 野指针
    if (ptr != null) {
    ……do_somthing
    }
    }

    2.指针所指向的地址空间已经被free或delete:在堆上malloc或者new出来的地址空间,如果已经free或delete,那么此时堆上的内存已经被释放,但是指向该内存的指针如果没有人为的修改过,那么指针还会继续指向这段堆上已经被释放的内存,这时还通过该指针去访问堆上的内存,就会造成不可预知的结果,给程序带来隐患,所以良好的编程习惯是:内存被free或delete后,指向该内存的指针马上置空。

    void func()
    {
    int *ptr = new int[5];
    delete []ptr;
    // 执行完delete后,ptr野指针
    }

    3.指针操作超越了作用域:

    void func()
    {
    int *ptr = null;
    {
    int a = 10;
    ptr = &a;
    } // a的作用域到此结束

    int b = *ptr; // ptr指向a,a已经被回收,ptr野指针
    }

    展开全文
  • C++野指针及c++指针使用注意点

    千次阅读 多人点赞 2019-08-29 16:11:33
    野指针c++指针使用注意点 避免野指针的产生 “野指针”的成因主要有: 1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时...
  • C++野指针测试

    2020-10-09 12:54:03
    C++中使用野指针,会出现崩溃的问题(实际项目中不要使用)。 测试程序如下: #include<iostream> using namespace std; int main() { //野指针 int *p = (int *)0x1234; //输出随机值 cout <<...
  • C++ 野指针和悬空指针

    2021-04-25 21:05:53
    野指针:指的是没有被初始化过的指针。 intmain(void){ int*p; std::cout<<*p<<std::endl; return 0; } 因此,为了防止出错,对于指针初始化时都是赋值为nullptr,这样在使用时编译器就会直接报错,...
  • c/c++野指针

    2012-06-20 00:35:43
    初次接触c/c++野指针概念是在自己面试的时候吧,当时知识面也很窄吧原因是,结果就是被pass了,再次遇到野指针的问题是在独自一人追踪自己的bug时,结果又是耗了我两天的时间.  该是总结的时候了,不想再糊糊涂涂的被...
  • c++野指针和内存泄漏

    千次阅读 2013-09-14 08:56:57
    尽管C++ 野指针和内存泄漏一直被诟病,但是在实时性很强的应用场合,c++ 仍然是不二之选。游戏服务器开发仍然使用c++ 作为主语言,但是大多结合动态脚本技术,一方面规避了野指针和内存泄露,一方面获得了开发效率和...
  • NULL 在C中NULL 是 (void *)0 的指针常量。...所以在C++11中出了nullptr,类型为std::nullptr_t,空指针常量可以隐式转换为其它类型,用来区分0与NULL的区别。 例如: void fun(int i) { cou...
  • c/c++野指针和空指针详解

    千次阅读 2019-11-29 21:50:36
    指针: 在指针声明时,* 号表示所声明的变量为指针 在指针使用时,* 号表示操作指针所指向的内存空间 1)* 相当通过地址... 野指针和空指针 空指针 标准定义了NULL指针,它作为一个特殊的指针变量...
  • C++野指针规避指南

    2021-03-23 00:16:49
    最让C/C++初学者头疼的问题,绝对少不了下面这俩:具体编程的时候,什么时候该调用函数?什么地方需要用到共用体、指针等?其实,我们在学校的时候也实践过这些知识点,比如期末考试让写个图书管理...
  • 尽管C++ 野指针和内存泄漏一直被诟病,但是在实时性很强的应用场合,c++ 仍然是不二之选。游戏服务器开发仍然使用c++ 作为主语言,但是大多结合动态脚本技术,一方面规避了野指针和内存泄露,一方面获得了开发效率和...
  • 野指针:指针没有做初始化操作,从而不明确指针所指向的位置,成为野指针。 指针悬挂:指针所指向的内存空间已经被删除,从而该指针所指向的空间就不确定了,容易导致错误或者崩溃。 内存泄漏(Memory Leak):是...
  •  尽管C++ 野指针和内存泄漏一直被诟病,但是在实时性很强的应用场合,c++ 仍然是不二之选。游戏服务器开发仍然使用c++ 作为主语言,但是大多结合动态脚本技术,一方面规避了野指针和内存泄露,一方面获得了开发效率...
  • C++野指针规避指南!

    2021-03-24 00:24:33
    点击上方蓝色小字,关注“涛哥聊Python”重磅干货,第一时间送达最让C/C++初学者头疼的问题,绝对少不了下面这俩:具体编程的时候,什么时候该调用函数?什么地方需要用到共用体、指针等?其...
  • C/C++ 野指针、指针悬挂

    千次阅读 2013-05-24 10:33:37
    野指针野指针是指向不可用内存区域的指针。野指针不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为if语句能够判断。但是野指针是很危险的,if不能判断一个指针是正常指针还是野指针。 ...
  • 野指针

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,400
精华内容 560
关键字:

c++野指针

c++ 订阅