首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 常見誤區:錯誤檢查 new 運算子返回值

     編輯:關於C++

C++ 核心誤區:別再檢查 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)皆完整實作標準行為,已無需擔心此舊版相容性問題。

最佳實務總結

  1. 預期配置失敗屬於「嚴重錯誤」 → 讓 bad_alloc 傳播,由上層統一處理或終止程式
  2. 需在區域處理配置失敗 → 使用 try-catch 捕捉 bad_alloc
  3. 極少數嵌入式/免異常環境 → 使用 new (std::nothrow) 並檢查返回值
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved