如果在申請動態(tài)內(nèi)存時找不到足夠大的連續(xù)字節(jié)內(nèi)存塊,malloc()和new()會使用不同的方式宣告內(nèi)存申請失敗,通常有如下幾種方式處理“內(nèi)存耗盡”問題:
1. 判斷指針是否為NULL,如果是則立刻用return語句終止本函數(shù)。例如:
Void Func(void)
{
A *a=new(nothrow) A;
If(a==NULL)return;
……
}
2. 判斷指針是否為NULL,如果是則立刻用exit(1)終止整個程序的運行,例如:
Void Func(void)
{
A *a=new(nothrow) A;
If(a==NULL)exit(1);
}
3. 為new和malloc()預(yù)設(shè)異常處理函數(shù),例如,Visual C++可以用_set_new_hander函數(shù)為new設(shè)置用戶自定義異常處理函數(shù),也可以讓malloc()享用與new相同的異常處理函數(shù)。
4. 捕獲new拋出的異常,并嘗試從中恢復(fù)。
上述(1)和(2)兩種方式使用最普通。如果一個函數(shù)內(nèi)有多處需要動態(tài)申請內(nèi)存,那么方式(1)就顯得力不從心,應(yīng)該用方式(2)來處理。不過在C++中我們提倡使用方式(4)。
有一個很重要的現(xiàn)象要告訴大家:
對于32位以上的應(yīng)用程序而言,一般情況下使用malloc()和new幾乎不可能導(dǎo)致‘內(nèi)存耗盡’。我在windows98下用Visual C++編寫了測試程序:
這個程序無休地運行下去,根本不會終止,因為32位操作系統(tǒng)支持‘虛存’,內(nèi)存用完了,自動用硬件空間頂替。
Void main()
{
Int *p=NULL;
Unsigned int len=1024*1024;
While(1){
P=new(nothrow) int[len]; //或者 malloc(sizeof(int)*len);
If(!p){
Len>>=1; //len縮小一半
If(len==0)
Exit(1);
Continue;
}
Cout<<“Allocated:”<<“(len*sizeof(int))”<<“bytes.”<<endl;
}
}
可以得出一個結(jié)論:
對于32位以上應(yīng)用程序,內(nèi)存耗盡錯誤處理程序幾乎毫無用處,但是必須強調(diào)不加錯誤處理將導(dǎo)致程序的質(zhì)量很差,千萬不可因小失大。