如果在申請動態內存時找不到足夠大的連續字節內存塊,malloc()和new()會使用不同的方式宣告內存申請失敗,通常有如下幾種方式處理“內存耗盡”問題:
1. 判斷指針是否為NULL,如果是則立刻用return語句終止本函數。例如:
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()預設異常處理函數,例如,Visual C++可以用_set_new_hander函數為new設置用戶自定義異常處理函數,也可以讓malloc()享用與new相同的異常處理函數。
4. 捕獲new拋出的異常,并嘗試從中恢復。
上述(1)和(2)兩種方式使用最普通。如果一個函數內有多處需要動態申請內存,那么方式(1)就顯得力不從心,應該用方式(2)來處理。不過在C++中我們提倡使用方式(4)。
有一個很重要的現象要告訴大家:
對于32位以上的應用程序而言,一般情況下使用malloc()和new幾乎不可能導致‘內存耗盡’。我在windows98下用Visual C++編寫了測試程序:
這個程序無休地運行下去,根本不會終止,因為32位操作系統支持‘虛存’,內存用完了,自動用硬件空間頂替。
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;
}
}
可以得出一個結論:
對于32位以上應用程序,內存耗盡錯誤處理程序幾乎毫無用處,但是必須強調不加錯誤處理將導致程序的質量很差,千萬不可因小失大。