new 失敗的三種可能行為| 編譯器類型 | 行為 | 應對 |
|---|---|---|
| 極舊 (預 C++98) | 回傳 nullptr | 檢查回傳值或重載 operator new 拋出 bad_alloc |
| 標準相容 | 呼叫 new_handler → 拋出 bad_alloc / abort() / 嘗試釋放記憶體 | 捕獲 bad_alloc;可自訂 set_new_handler |
| 部分配置 | 直接 abort()/exit() | 無法捕獲,設計上避免大量單次分配 |
可移植代碼必須同時處理三種情況。
throw(...)noexcept)。unexpected(),但 MSVC 等編譯器不執行檢查。.dll/.so 邊界拋出異常 → 未定義行為 (崩潰、資源洩漏、靜默錯誤)。std::error_code,異常必須在庫內部捕獲轉換。__try/__except/__finally 為 MSVC 擴充,無法跨平台編譯。try/catch。catch(...) 捕獲範圍不一致std::exception 或任意型別 throw)。/EHa):亦捕獲硬體例外 (存取違規、除零、堆疊溢位)。catch(...) 捕獲硬體例外 實作程式邏輯。硬體例外應由作業系統/執行期處理 (如崩潰轉儲)。| 等級 | 保證 | 實作關鍵 |
|---|---|---|
| 基本承諾 | 不洩漏資源、物件保持有效狀態 | RAII 封裝所有資源 |
| 強烈承諾 | 操作失敗狀態回滾如未執行 | Copy-and-swap / 交易式修改 |
| 不拋出承諾 | 操作絕不拋出異常 | noexcept、避免分配/鎖 |