【轉】C語言:內(nèi)存使用
1.用malloc或new申請內(nèi)存之后,應該立即檢查指針值是否為NULL。防止使用指針值為NULL的內(nèi)存。
2.不要忘記為數(shù)組和動態(tài)內(nèi)存賦初值。防止將未被初始化的內(nèi)存作為右值使用。
3.避免數(shù)組或指針的下標越界,特別要當心發(fā)生“多1”或者“少1”操作。
4.動態(tài)內(nèi)存的申請與釋放必須配對,防止內(nèi)存泄漏。
5.用free或delete釋放了內(nèi)存之后,立即將指針設置為NULL,防止產(chǎn)生“野指針”。
下面舉幾個經(jīng)典的錯誤例子,大家不要犯同樣的錯誤:
1. 返回棧內(nèi)存指針
char *GetString(void)
{
char *p = "hello world";
return p;
}
char* pGet = GetString();
這段程序編譯時沒有錯誤,運行也沒有錯誤,但是你卻無法使得返回的pGet指針指向的數(shù)據(jù)是你想要的“hello world”,因為指針p的生命期是函數(shù)GetString內(nèi),運行完函數(shù)GetString后,p分配的棧空間馬上被系統(tǒng)回收了。雖然pGet指向了p當初分配的內(nèi)存地址,但是那塊地址已經(jīng)沒有內(nèi)容了。
2.這是一個出現(xiàn)頻率非常高的錯誤
char* pChar = new char;
……
int a ;
pChar = &a;
……
delete pChar;
當然這是一個例子,具體的程序各有不同。
這段程序有兩個問題。一是pChar = &a;將導致pChar原先分配的空間無法再被獲取,就象我們的丟失了朋友的電話號碼一樣,無法再聯(lián)系這個朋友了。這就造成了內(nèi)存泄漏。如果內(nèi)存泄漏多了,可能導致系統(tǒng)的崩潰,因為可用的資源將越來越少,直到枯竭為止。第二個問題是delete pChar將導致異常發(fā)生,因為這時的pChar已經(jīng)不是指向動態(tài)分配的內(nèi)存了,而是指向了a分配的棧空間,而棧空間是不能使用delete來回收的,因此將導致內(nèi)存異常。
內(nèi)存是財富,正確使用財富是關鍵,為人如此,編程也如此。

浙公網(wǎng)安備 33010602011771號