條款50 瞭解new和delete的合理替換時機
想要替換編譯器提供的operator new或operator delete三個理由
1 用來檢測運用上錯誤 new後沒有delete,或多次delete
2 強化效能 編譯器的operator new和operator delete主要用於一般性,定製版的效果往往更好
3 收集使用上的統計數據
寫一個定製型operator new十分簡單 注意齊位,如果沒有這個條件,可能導致運行期硬件異常;再者,齊位可能提高訪問速度
條款51 編寫new和delete時需固守常規
1 內存不足時,必需調用new-handling函數,必須有對付零內存的準備,還需避免掩蓋正常形式的new。operator new返回值:有能力提供內存就返回一個指針指向內存,否則按條款49規則並拋出一個bad_alloc異常
2 operator new實際不止一次嘗試分配內存,在每次失敗後調用new-handing函數,只有new-handing函數指針是null,operator new纔會拋出異常。當要求分配內存size爲0時,實際可能會分配一個字節內存返回,而不是空。
operator new成員函數爲某個特定class定製時,會被derived classes繼承,需注意
注意:(1) operator new應該內存一個無窮循環,在其中嘗試分配內存
條款52:寫了placement new也要寫placement delete
Widget *pw = new Widget
共有兩個函數被調用:一個是分配內存的operator new, 一個是Widget的default構造函數。若第一個調用成功,第二個拋出異常。需要將內存分配取消恢復舊觀,否則會造成內存泄露。
placement new:其定義爲operator new接受的參數除了size_t以外,還有其它。
void* operator new(std:size_t, void* pMemory) throw();
這個new的用途之一在負責在vector的未使用空間上創建對象
Widget* pw = new (std::cerr)Widget;
規則:如果一個帶額外參數的operator new沒有“帶相同額外參數”的對應版operator delete,那麼當new內存分配動作需要取消並恢復舊觀時就沒有任何operator delete會被調用,會造成內存泄露