閱讀 SO: operator new 回傳 null

在自己實作 class operator new 時,只有在你的 operator new 有著 noexcept 表示不會拋出 exception (通常指的是 std::bad_alloc),你才能使用 回傳 NULL 表示其 allocation 失敗。除此之外,應當使用 throw std::bad_alloc 來表達出你無法分配空間的錯誤。

所以當你的 operator new 沒有 noexcept,又回傳 null。C++ runtime 會認為其 pointer 有指向有效的位置,於是就會讓 this 帶著 0x00000000 走進 constructor,然而這樣的行為基本上已經是一種 UB。但如果你有標 noexcept,C++ runtime 就會檢查是否為 null,能夠提早 return。

Reference:
Override 'new' with a pool allocator; return NULL?

comments powered by Disqus