首頁 > 後端開發 > C++ > 不同 C 編譯器中「new」運算子的行為是什麼,特別是在記憶體分配失敗方面?

不同 C 編譯器中「new」運算子的行為是什麼,特別是在記憶體分配失敗方面?

Susan Sarandon
發布: 2024-11-17 20:14:02
原創
602 人瀏覽過

What is the Behavior of the `new` Operator in Different C   Compilers, Especially Regarding Memory Allocation Failure?

New 會回傳 NULL 嗎?

在 C 中,new 運算子負責為新物件分配記憶體。根據C標準,如果new分配記憶體失敗,預計會拋出std::bad_alloc異常。然而,有傳言稱某些編譯器,例如 Visual C 6 (VC6),偏離了這種行為。

VC6 不符合

傳聞是真的。預設情況下,VC6 在這方面不遵守 C 標準。當 new 分配記憶體失敗時,它會傳回 0(或 NULL)而不是拋出例外。

微軟的解決方法

微軟認識到了這個問題並提供了建議的解決方法:使用自訂的新處理程序。開發人員可以指定自己的運算子 new 實現,該實現將拋出 std::bad_alloc 異常而不是返回 0。

後來的 MSVC 編譯器

在 MSVC 的後續版本中(從 7.0 及更高版本開始),new 的行為變得更加複雜。有一組規則決定它是拋出異常還是回傳 0。

VS2005 及以後

使用 VS2005 (MSVC 8.0),微軟終於清理乾淨了這種行為。預設情況下,new 現在會拋出 std::bad_alloc 異常,除非明確連結到 nothrownew.obj。

替代方法:std::nothrow

開發人員也可以指定他們希望 new 回傳 0,而不是使用 std::nothrow 參數拋出例外。這允許跨編譯器保持一致的行為,即使是為 VC6 編寫的遺留程式碼也是如此。

以上是不同 C 編譯器中「new」運算子的行為是什麼,特別是在記憶體分配失敗方面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板