天天看點

Effective C++ 讀書筆記之Part8.Customizing new and delete

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内部的結構。

繼續閱讀