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