C語言:記憶體使用

91program發表於2008-01-20
1.用malloc或new申請記憶體之後,應該立即檢查指標值是否為NULL。防止使用指標值為NULL的記憶體。
2.不要忘記為陣列和動態記憶體賦初值。防止將未被初始化的記憶體作為右值使用。
3.避免陣列或指標的下標越界,特別要當心發生“多1”或者“少1”操作。
4.動態記憶體的申請與釋放必須配對,防止記憶體洩漏。
5.用free或delete釋放了記憶體之後,立即將指標設定為NULL,防止產生“野指標”。

下面舉幾個經典的錯誤例子,大家不要犯同樣的錯誤:  
1. 返回棧記憶體指標  
  char *GetString(void)  
  {
      char *p = "hello world";  
      return p;  
  } 
  char* pGet = GetString();  
  這段程式編譯時沒有錯誤,執行也沒有錯誤,但是你卻無法使得返回的pGet指標指向的資料是你想要的“hello world”,因為指標p的生命期是函式GetString內,執行完函式GetString後,p分配的棧空間馬上被系統回收了。雖然pGet指向了p當初分配的記憶體地址,但是那塊地址已經沒有內容了。  
2.這是一個出現頻率非常高的錯誤  
  char* pChar = new char;  
  ……  
  int a ;  
  pChar = &a;  
  ……  
  delete pChar;  
  當然這是一個例子,具體的程式各有不同。  
  這段程式有兩個問題。一是pChar = &a;將導致pChar原先分配的空間無法再被獲取,就象我們的丟失了朋友的電話號碼一樣,無法再聯絡這個朋友了。這就造成了記憶體洩漏。如果記憶體洩漏多了,可能導致系統的崩潰,因為可用的資源將越來越少,直到枯竭為止。第二個問題是delete pChar將導致異常發生,因為這時的pChar已經不是指向動態分配的記憶體了,而是指向了a分配的棧空間,而棧空間是不能使用delete來回收的,因此將導致記憶體異常。  
  記憶體是財富,正確使用財富是關鍵,為人如此,程式設計也如此。
 

相關文章