8 定製new和delete

 

條款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會被調用,會造成內存泄露

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章