三大處理策略:
void Func() {
A* a = new A;
if (a == nullptr) return; // 釋放責任在呼叫端,適合單一分配點
...
}
void Func() {
A* a = new A;
if (a == nullptr) {
cout << "Memory Exhausted" << endl;
exit(1); // 徹底結束,避免殘留破壞系統
}
...
}
多分配點時策略 1 麻煩 (需層層傳回釋放),**策略 2 乾淨利落**。
VC++ _set_new_handler 設定 new 失敗回呼,亦可讓 malloc 共用。詳見編譯器文檔。
記憶體耗盡 = 惡徒持刀。不 exit(1) 擊斃壞進程,它會拖垮整個 OS (如病毒擴散)。**及時止損是責任**。
void main() {
float* p = nullptr;
while (true) {
p = new float[1000000]; // 不斷申請 4MB
cout << "eat memory" << endl;
if (p == nullptr) exit(1); // 永遠不會觸發!
}
}
**現象**:硬碟狂響、系統卡死、滑鼠鍵盤無回應,**但程式不會因 nullptr 退出**。
**原因**:虛擬記憶體將硬碟空間當記憶體用,物理 RAM 用盡自動換頁,**理論上永遠分配成功**,直到硬碟也滿 (極難)。