49. Understand the behavior of the new-handler.
總結:
第一,set_new_handler允許客戶指定一個函數,在記憶體配置設定無法獲得滿足時被調用。
第二,Nothrow new是一個頗為局限的工具,因為它隻适用于記憶體配置設定;後繼的構造函數調用還是可能抛出異常。
50. Understand when it makes sense to replace new and delete.
替換編譯器提供的operator new或operator delete的理由:
1)用來檢測運用上的錯誤。
2)為了強化效能。
3)為了收集使用上的統計資料。
4)為了增加配置設定和歸還的速度。
5)為了降低預設記憶體管理器帶來的空間額外開銷。
6)為了彌補預設配置設定器中的非最佳齊味(suboptimal alignment)。
7)為了将相關對象成簇集中。
8)為了獲得非傳統的行為。
有許多理由需要寫個自定的new和delete,包括改善效能、對heap運作錯誤進行調試、收集heap使用資訊。
51. Adhere to convention when writing new and delete.
第一,operator new應該内包含一個無窮循環,并在其中嘗試配置設定記憶體,如果它無法滿足記憶體需求,就該調用new-handler。它也應該有能力處理0 bytes申請。Class專屬版本則還應該處理“比正确大小更大的(錯誤)申請”。
第二,operator delete應該在收到null指針時不做任何事。Class專屬版本則還應該處理“比正确大小更大的(錯誤)申請”。
52.Write placement delete if you write placement new.
第一,當你寫一個placement operator new,請确定也寫出了對應的placement operator delete。如果沒有這樣做,你的程式可能會發生隐微而時斷時續的記憶體洩露。
第二,當你聲明placement new 和placement delete,請确定不要無意識(非故意)地掩蓋了他們的正常版本。
批注:
本部分内容主要關注自己實作new和delete的時候需要注意的一些事項,這些功能在平時使用的不多。但是很有助于了解new和delete内部的結構。