《Effective C++》讀書筆記之item52:寫了placement new也要寫placement delete
阿新 • • 發佈:2019-02-05
1.當在類中聲明瞭一個placement new(一個特定位置上的new),它接受了除std::size_t外的其他變數作為引數,則必須同樣宣告一個placement delete並且其引數與placement new相同以取得對應關係,這樣當記憶體分配失敗時C++編譯器將呼叫與placement new相匹配的placement delete歸還記憶體。
注意placement delete只有在“伴隨placement new呼叫而觸發的建構函式”出現異常時才會被呼叫,對一個已經存在的指標進行delete時不會呼叫它。
2.應當避免class專屬的new掩蓋客戶期望的其他new,如通用版本的new或其基類中的new,方法是在適當的作用域中使用using宣告式。
預設情況下C++在global作用域中提供以下三種形式的operator new:
void* operator new(std::size_t) throw(std::bad_alloc); //normal new void* operator new(std::size_t, void*) throw(); //placement new void* operator new(std::size_t, const std::nothrow_t&) throw(); //nothrow new
如果在類內宣告專屬的operator new,會遮掩上述版本。一般情況下應當保證這些函式在類外可用,同時應當宣告成對的operator new和operator delete。可以宣告一個基類包含所有上述函式及其對應的operator delete函式,自己定義類繼承這個基類並使用using宣告式以取得標準形式,使其與自定義版本不發生命名衝突。