new 的返回值了許多從 C 轉向 C++ 的開發者習慣在記憶體配置後檢查指標是否為空值(nullptr),這在 malloc/calloc 是正確做法,但套用到 new 上卻是嚴重誤區。
int* p = new int[SIZE];
if (p == nullptr) // 錯誤!這裡永遠不會為真
return -1;
根據 C++ 標準,new 運算子在配置失敗時預設會拋出 std::bad_alloc 異常,而非返回空指標。因此:
p != nullptr,條件不成立catch 區塊,根本不會執行 if 判斷try {
int* p = new int[SIZE];
// 使用 p...
}
catch (const std::bad_alloc& e) {
std::cerr << "記憶體配置失敗: " << e.what() << std::endl;
return -1;
}
nothrow 版本若確實需要 new 返回空指標而非拋出異常,可使用 std::nothrow:
int* p = new (std::nothrow) int[SIZE];
if (p == nullptr) { // 這時檢查才有意義
// 處理失敗
}
注意:使用 nothrow 版本時,必須包含 <new> 標頭檔。
早期 C++ 編譯器(C++98 前)可能不支援異常機制,當時 new 確實會返回空指標。但現代所有主流編譯器(MSVC、GCC、Clang)皆完整實作標準行為,已無需擔心此舊版相容性問題。
bad_alloc 傳播,由上層統一處理或終止程式try-catch 捕捉 bad_allocnew (std::nothrow) 並檢查返回值