正文

回到頂部

1. new-handler介紹

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

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

在operator new由于不能滿足內(nèi)存分配要求而拋出異常之前,它會(huì)調(diào)用一個(gè)客戶指定的叫做new-handler的錯(cuò)誤處理函數(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)庫(kù)函數(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ù)沒(méi)有參數(shù)沒(méi)有返回值,set_new_handler是一個(gè)參數(shù)和返回值都為new_handler的函數(shù)。(函數(shù)set_new_handler聲明結(jié)束處的”throw()”是一個(gè)異常指定(exception specification)。從本質(zhì)上來(lái)說(shuō)它的意思是說(shuō)這個(gè)函數(shù)不會(huì)拋出任何異常,然而事實(shí)更加有意思。詳細(xì)內(nèi)容見(jiàn)Item 29。)

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

網(wǎng)友評(píng)論