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中文網其他相關文章!