天天看點

C++之了解new和delete的合理替換時機(50)---《Effective C++》

條款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可以使我們得以輕松收集到這些資訊。

進行一個更細緻的劃分,即

  1. 為了檢測運用錯誤;
  2. 為了收集動态配置設定記憶體之使用統計資訊;
  3. 為了增加配置設定和歸還的速度;
  4. 為了降低預設記憶體管理器所帶來的空間額外開銷;
  5. 為了彌補預設配置設定器中的非最佳齊位;
  6. 為了将相關對象成簇集中;
  7. 為了獲得非傳統的行為。

總結:

有很多理由需要編寫自定義的operator new和delete函數,包括改善效能、對heap運用錯誤進行調試以及收集heap使用資訊。

繼續閱讀