首頁 >後端開發 >C++ >為什麼 `new` 有時會回傳 NULL 而不是拋出例外?

為什麼 `new` 有時會回傳 NULL 而不是拋出例外?

Linda Hamilton
Linda Hamilton原創
2024-11-21 17:53:12882瀏覽

Why Does `new` Sometimes Return NULL Instead of Throwing an Exception?

New() 拋出NULL 例外:編譯器合規性

C 標準要求new 運算子在下列情況下拋出::bad_alloc 異常:它無法分配記憶體。然而,有人擔心某些編譯器的行為,特別是 VC6,它可能不遵守此標準。

VC6 不合規

在這種情況下VC6的版本已經證實,新的算子確實沒有默認遵循標準。相反,它在失敗時傳回 0 (NULL)。這種行為給開發人員帶來了挑戰,因為它需要在每個新語句後明確檢查 NULL,從而使程式碼在美觀上沒有吸引力。

Microsoft 的回應和解決方法

Microsoft 承認這一非- 合規性並提供了使用自訂新處理程序的解決方法。或者,開發人員可以利用 nothrownew.obj 物件檔案在較新的 MSVC 編譯器(7.0 及更高版本)中模仿 VC6 的行為。

當前合規狀態

幸運的是,在MSVC 8.0 (VS2005),新的預設行為已修改為遵守標準,現在拋出記憶體分配失敗時出現std::bad_alloc 異常。只有當需要原始的類似 VC6 的行為時,才需要連結到 nothrownew.obj。

手動返回Null 的選項

開發人員可以靈活地指定new 應該回傳0 而不是透過使用std::nothrow 參數拋出異常:

SomeType *p = new(std::nothrow) SomeType;

此技術允許跨編譯器採用一致的方法,並透過消除修改現有錯誤處理機制的需要來簡化程式碼維護。

以上是為什麼 `new` 有時會回傳 NULL 而不是拋出例外?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn