c/c++指針精髓二(2)

1.3. 5杜絕“野指針”

“野指針”不是NULL指針,是指向“垃圾”內存的指針。人們一般不會錯用NULL指針,因爲用if語句很容易判斷。但是“野指針”是很危險的,if語句對它不起作用。 “野指針”的原因主要有如下幾種:

(1)指針變量沒有被初始化。任何指針變量剛被創建時不會自動成爲NULL指針,它的缺省值是隨機的,它會亂指一氣。所以,指針變量在創建的同時應當被初始化,要麼將指針設置爲NULL,要麼讓它指向合法的內存。例如

char *ip = NULL;

char *ip = new char;

(2)指針ip被free或者delete之後,沒有置爲NULL,讓人誤以爲ip是個合法的指針。

(3)指針操作超越了變量的作用範圍。這種情況讓人防不勝防,示例程序如下:

C代碼 複製代碼
  1. class A   
  2.   
  3. {   
  4.   
  5.  public:   
  6.   
  7.   void Func(void){ std::cout << “Func of class A” << std::endl; }   
  8.   
  9. };   
  10.   
  11. void Test(void)   
  12.   
  13. {   
  14.   
  15.  A *p;   
  16.   
  17.  {   
  18.   
  19.   A a;   
  20.   
  21.   p = &a; // 注意 a 的生命期   
  22.   
  23.  }   
  24.   
  25.  p->Func(); // p是“野指針”   
  26.   
  27. }  



函數Test在執行語句p->Func()時,對象a已經消失,而p是指向a的,所以p就成了“野指針”。但奇怪的是有些編譯器運行這個程序時居然沒有出錯,這可能與編譯器有關。

1.3.6指針參數是如何傳遞內存的?

如果函數的參數是一個指針,不要指望用該指針去申請動態內存。見如下例子:

C代碼 複製代碼
  1. void GetMemory(char *ip, int num)   
  2.   
  3. {   
  4.   
  5.  ip = (char *)malloc(sizeof(char) * num);   
  6.   
  7. }   
  8.   
  9. void Test(void)   
  10.   
  11. {   
  12.   
  13.  char *str = NULL;   
  14.   
  15.  GetMemory(str, 100); // str 仍然爲 NULL   
  16.   
  17.  strcpy(str, "hello"); // 運行錯誤   
  18.   
  19. }  
發佈了20 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章