C語言中野指針與內存泄漏

內存泄漏

 用動態存儲分配函數動態開闢的空間,在使用完畢後未釋放,結果導致一直佔據該內存單元,不能被任何程序再次使用,直到程序結束。即所謂內存泄漏。

   注意:內存泄漏是指堆內存的泄漏。

 簡單的說就是申請了一塊內存空間,使用完畢後沒有釋放掉。它的一般表現方式是程序運行時間越長,佔用內存越多,最終用盡全部內存,整個系統崩潰。由程序申請的一塊內存,且沒有任何一個指針指向它,那麼這塊內存就泄露了。

野指針

  “野指針”不是NULL指針,是未初始化或未清零的指針,他指向的內存地址不是程序員想要的。人們一般不會錯用NULL指針,因爲用if語句很容易判斷。但是“野指針”是很危險的,if語句對它不起作用。野指針的成因主要有兩種:

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

  二、指針p被free或者delete之後,沒有置爲NULL,讓人誤以爲p是個合法的指針。別看free和delete的名字惡狠狠的(尤其是delete),它們只是把指針所指的內存給釋放掉,但並沒有把指針本身幹掉。通常會用語句if (p != NULL)進行防錯處理。很遺憾,此時if語句起不到防錯作用,因爲即便p不是NULL指針,它也不指向合法的內存塊。例:

[cpp] view plain copy
  1. 1   #include<stdio.h>  
  2.  2   #include<stdlib.h>  
  3.  3   
  4.  4  int main()  
  5.  5  {  
  6.  6     char *p=(char *)malloc(sizeof(char)*100);  
  7.  7    strcpy(p, “hello”);   
  8.  8    printf(“%s ”,p);   
  9.  9  free(p); // p 所指的內存被釋放,但是p所指的地址仍然不變   
  10. 10  if(p != NULL) // 沒有起到防錯作用   
  11. 11     strcpy(p, “world”); // 出錯   
  12. 12     printf(“%s \n”,p);  
  13. 13 }  

free()釋放的是指針指向的內存!注意!釋放的是內存,不是指針!這點非常非常重要!指針是一個變量,只有程序結束時才被銷燬。釋放了內存空間後,原來指向這塊空間的指針還是存在!只不過現在指針指向的內容的垃圾,是未定義的,所以說是垃圾。因此,前面我已經說過了,釋放內存後把指針指向NULL,防止指針在後面不小心又被解引用了。非常重要啊這一點!

  在使用指針的時候還要注意的問題:

  1:不要返回指向棧內存的指針或引用,因爲棧內存在函數結束時會被釋放.

      2:  在使用指針進行內存操作前記得要先給指針分配一個動態內存。


發佈了62 篇原創文章 · 獲贊 9 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章