條款50:了解new和delete的合理替換時機
為什麼我們還想要替換掉編譯器提供的operator new或者operator delete呢?下面給出三個常見理由:
1)用來檢測運用上的錯誤:如果将“new所得記憶體”delete掉卻不幸失敗,會導緻記憶體洩漏;如果在“new所得記憶體”上面多次進行delete便會導緻不确定的行為;如果operator new持有一系列動态配置設定所得位址,operator delete可以将其從位址中移除,很容易檢測上述錯誤用法;
2)為了強化效能,編譯器提供的operator new和operator delete主要用于一般目的,它們不但可以被長時間執行的程式接受,也可以被短時間内執行的程式接受,是以它們必須接納各種配置設定形态,同時必須考慮破碎問題,導緻程式無法滿足大區塊記憶體要求,是以我們需要自己定制operator new和operator delete函數,使得程式執行的效率可以得到提升;
3)為了收集使用上的資料,動态記憶體配置設定,他們的運作型态是否随時間改變,是以自定義的operator new和operator delete可以使我們得以輕松收集到這些資訊。
進行一個更細緻的劃分,即
- 為了檢測運用錯誤;
- 為了收集動态配置設定記憶體之使用統計資訊;
- 為了增加配置設定和歸還的速度;
- 為了降低預設記憶體管理器所帶來的空間額外開銷;
- 為了彌補預設配置設定器中的非最佳齊位;
- 為了将相關對象成簇集中;
- 為了獲得非傳統的行為。
總結:
有很多理由需要編寫自定義的operator new和delete函數,包括改善效能、對heap運用錯誤進行調試以及收集heap使用資訊。