正文

回到頂部

1. new-handler介紹

當(dāng)操作符new不能滿足內(nèi)存分配請求的時(shí)候,它就會拋出異常。很久之前,它會返回一個(gè)null指針,一些舊的編譯器仍然會這么做。你仍然會看到這種舊行為,但是我會把關(guān)于它的討論推遲到本條款結(jié)束的時(shí)候。

1.1 調(diào)用set_new_handler來指定全局new-handler

在operator new由于不能滿足內(nèi)存分配要求而拋出異常之前,它會調(diào)用一個(gè)客戶指定的叫做new-handler的錯誤處理函數(shù)。(這也不是完全正確的。Operator new的真正行為更加復(fù)雜。詳細(xì)內(nèi)容在Item 51中描述。)為了指定內(nèi)存溢出處理(out-of-memory-handling)函數(shù),客戶可以調(diào)用set_new_handler函數(shù),這個(gè)標(biāo)準(zhǔn)庫函數(shù)被聲明在<new>中:

1 namespace std {2 typedef void (*new_handler)();3 new_handler set_new_handler(new_handler p) throw();4 }

 

正如你所看到的,new_handler是一個(gè)函數(shù)指針的typedef,這個(gè)函數(shù)沒有參數(shù)沒有返回值,set_new_handler是一個(gè)參數(shù)和返回值都為new_handler的函數(shù)。(函數(shù)set_new_handler聲明結(jié)束處的”throw()”是一個(gè)異常指定(exception specification)。從本質(zhì)上來說它的意思是說這個(gè)函數(shù)不會拋出任何異常,然而事實(shí)更加有意思。詳細(xì)內(nèi)容見Item 29。)

set_new_handler的參數(shù)是指向函數(shù)的指針,operator new會在請求的內(nèi)存無法分配的情況下調(diào)用這個(gè)函數(shù)。Set_new_handler的返回值也是指向函數(shù)的指針,返回的是在調(diào)用set_new_handler之前調(diào)用的new_handler函數(shù)(也就是在new_handler被替換之前的函數(shù))。

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式