動態配置失敗時,malloc 與 new 回傳 NULL。三種常見處理方式:
void Func() {
A* a = new A;
if (a == NULL) return;
// ...
}
void Func() {
A* a = new A;
if (a == NULL) {
cout << "Memory Exhausted" << endl;
exit(1);
}
// ...
}
如 Visual C++ _set_new_handler 設定自訂例外處理函式,讓 malloc 共用同一機制。詳見編譯器文件。
方式一、二最普遍。函式內多處配置記憶體時,方式一釋放記憶體麻煩,宜用方式二。
不行。記憶體耗盡意味著應用程式已無藥可救。若不
exit(1)殺死壞程式,它可能拖垮作業系統。如同不擊斃歹徒,歹徒老死前會犯更多罪。
對 32 位元以上應用程式,無論如何用 malloc/new,**幾乎不可能導致記憶體耗盡**。
實測:Windows 98 + VC++,無限配置 float[1000000],程式不會終止,硬碟狂響(虛擬記憶體換頁),系統對鍵盤滑鼠無回應。
void main() {
float* p = NULL;
while (TRUE) {
p = new float[1000000];
cout << "eat memory" << endl;
if (p == NULL) exit(1); // 永遠不會執行
}
}
結論:32 位元 OS 支援虛擬記憶體,實體記憶體用盡自動用硬碟頂替。記憶體耗盡錯誤處理碼在 32 位元系統「毫無用處」。
不加錯誤處理將導致程式品質極差,**千萬不可因小失大**。
雖 32 位元系統幾乎不會真正耗盡記憶體,但嵌入式系統、64 位元系統大量配置、資源受限環境仍可能發生。優良程式**必須**保留錯誤處理邏輯,體現工程專業素養。