现在的位置: 首页 > 综合 > 正文

free野指

2017年12月24日 ⁄ 综合 ⁄ 共 915字 ⁄ 字号 评论关闭

野指针的成因主要有三种:   

  一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。   

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

复制代码
#include <stdio.h>
#include <string.h>
#include <malloc.h>  

int main(void)
{
  char *p = (char *) malloc(100);
  strcpy(p, "hello"); 
  free(p);      // p 所指的内存被释放,但是p所指的地址仍然不变,原来的内存变为“垃圾”内存(不可用内存 
  if(p != NULL) // 没有起到防错作用     
  strcpy(p, "world");   
   for(i=0;i<5;i++){
     printf("%c",*(p++));//i=5后为乱码
     printf("\n");
}      
}  
复制代码

   另外一个要注意的问题:不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。  

  三、指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下:  

复制代码
class A
  {
  public:
  void Func(void){ cout << “Func of class A” << endl; }
  };
  class B
  {
  public:
  A *p;
  void Test(void)
  {
  A a;
  p = &a; // 注意 a 的生命期 ,只在这个函数Test中,而不是整个class B
  }
  void Test1()
  {
  p->Func(); // p 是“野指针”
  }
  } 
复制代码

函数 Test1 在执行语句 p->Func()时,对象 a 已经消失,而 p 是指向 a 的,所以 p 就成了“野指针” 。

【上篇】
【下篇】

抱歉!评论已关闭.