野指針的成因

引自:http://baike.baidu.com/view/1291320.htm
野指針的成因主要有三種:
  一、指針變量沒有被初始化。任何指針變量剛被創建時不會自動成爲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++) //i=5後爲亂碼
  printf("%c",*(p+i));
  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 就成了“野指針” 。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章