C語言:記憶體使用
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來回收的,因此將導致記憶體異常。
記憶體是財富,正確使用財富是關鍵,為人如此,程式設計也如此。
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來回收的,因此將導致記憶體異常。
記憶體是財富,正確使用財富是關鍵,為人如此,程式設計也如此。
相關文章
- C語言-記憶體分配C語言記憶體
- C語言的記憶體分配C語言記憶體
- C語言記憶體對齊C語言記憶體
- C語言-記憶體管理之一[記憶體分配]C語言記憶體
- C語言-記憶體管理之二[記憶體指令]C語言記憶體
- C語言(動態記憶體分配)C語言記憶體
- C語言記憶體地址基礎C語言記憶體
- 第1天 C語言Dev-Cpp環境搭建及使用、C語言記憶體四區C語言dev記憶體
- C語言記憶體管理,分配、使用、釋放以及安全性C語言記憶體
- C 語言結構體記憶體佈局問題結構體記憶體
- C語言結構體記憶體佈局問題C語言結構體記憶體
- 【C語言】整型在記憶體中的儲存C語言記憶體
- C語言:記憶體位元組對齊詳解C語言記憶體
- Go語言記憶體模型Go記憶體模型
- Java記憶體模型FAQ(二) 其他語言,像C++,也有記憶體模型嗎?Java記憶體模型C++
- 關於c語言記憶體分配,malloc,free,和段錯誤,記憶體洩露C語言記憶體洩露
- Rust語言記憶體管理之妙Rust記憶體
- C語言-記憶體函式的實現(一)之memcpyC語言記憶體函式memcpy
- C語言-記憶體函式的實現(二)之memmoveC語言記憶體函式
- C語言記憶體洩露很嚴重,如何應對?C語言記憶體洩露
- C語言malloc()函式:動態分配記憶體空間C語言函式記憶體
- 圖解Go語言記憶體分配圖解Go記憶體
- [譯]Go語言記憶體佈局Go記憶體
- Go 語言的手工記憶體管理Go記憶體
- c語言強制記憶體轉化引發的問題C語言記憶體
- C語言細節 儲存類別,連結,記憶體管理C語言記憶體
- C語言之動態記憶體管理C語言記憶體
- 用動態記憶體讀入任意大小的檔案(c語言)記憶體C語言
- Android NDK開發之旅3 C語言基礎 記憶體分配AndroidC語言記憶體
- c語言野指標與結構體指標動態記憶體分配小解C語言指標結構體記憶體
- Objective-C----記憶體管理--點語法Object記憶體
- c語言筆記C語言筆記
- C語言第三篇:C語言資料型別及各資料型別所佔記憶體位元組數C語言資料型別記憶體
- C語言 共用體C語言
- Solidity語言學習筆記————41、記憶體佈局Solid筆記記憶體
- 學了指標沒學動態記憶體一切都白搭!C語言基礎教程之記憶體管理指標記憶體C語言
- 易語言資料型別記憶體分佈格式資料型別記憶體
- C 語言中的指標和記憶體洩漏指標記憶體