Effective C++ --8 定制new和delete 9杂谈讨论
上一篇Effective C++ --7 模板與泛型編程
?
Effective C++ --8 定制new和delete
49、了解new-handler的行為
?(1)set_new_handler允許客戶指定一個函數,在內存分配無法獲得滿足時被滿足。Operate new 確保在分配class對象內存的過程中以class專屬之new_handler替換global new-handler。
?(2)Nothrow new是一個頗為局限的工具,因為它只適用于內存分配,后續的構造函數調用還是可能拋出異常。
50、了解new和delete的合理替換時機
?(1)替換編譯器所提供的operator new和operator delete的理由:用來檢測運用上的錯誤、為了強化效能、為了收集使用上的統計數據。
51、編寫new和delete時需固守常規
?(1)operator new應該內含一個無窮循環,并在其中嘗試分配內存,如果它無法滿足內存需求,就該調用new_handler。它也應該有能力處理0bytes申請,通常將0byte申請視為1byte。Class專屬版本則還應該處理“比正確大小更大的(錯誤)申請”。
?(2)operator delete應該在收到null指針時不做任何事情。Class專屬版本則還應該處理“比正確大小更大的(錯誤)申請”。
52、寫了placement new也要寫placement delete
?(1)placement new是指非正常形式附帶參數的operator new,operator new接受的參數除了一定會有的那個size_t之外還有別的參數。正常的operator new函數為 void* operator new(std::size_t)throw(std::bad_alloc);
?(2)當寫了一個placement operator new時,要確定也寫出了對應的placement delete。如果沒有那么做,程序可能會發生隱微而時斷時續的內存泄露。如果沒有聲明對應的placement operator delete,運行期系統不知道如何取消并恢復原先對placement new的調用,這樣就會造成內存泄露。Placement delete只有在伴隨placement new調用而觸發的構造函數出現異常時才會被調用,平時不會調用。
?(3)當聲明placement new 和placement delete時,確定不要無意識地遮掩了正常版本。如果在class內聲明任何operator new,就會遮掩所有operator new、placement new和nothrow new。
Effective C++ --9雜談討論
53、不要輕忽編譯器的警告
?(1)嚴肅對待編譯器發出的警告信息。努力在編譯器最高警告級別下爭取“無任何警告”的榮譽。
?(2)不要過度依賴編譯器的報警能力,因為不同的編譯器對待事物的態度并不相同。一旦移植到另一個編譯器上,原本依賴的警告信息有可能消失。
54、讓自己熟悉包括TR1在內的標準程序庫
?(1)C++標準程序庫的主要機能由STL、iostreams、locales(multiple active locales,多區域)組成。并包含C99標準庫。
?(2)TR1添加了智能指針(tr1::shared_ptr)、一般化函數指針(tr1::function)、hash-based容器、正則表達式(regular expression)以及另外10個組件的支持。
?(3)TR1自身只是一份規范,為獲得TR1提供的好處,需要一份實物。一個好的實物來源是Boost。
55、讓自己熟悉Boost
(1)Boost在標準化過程中扮演深具影響力的角色,提供許多TR1組件實現品,以及許多程序庫。
總結
以上是生活随笔為你收集整理的Effective C++ --8 定制new和delete 9杂谈讨论的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Effective C++ --7 模板
- 下一篇: Effective C++ -- 零散知