正文
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ù))。
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線安全]玩轉(zhuǎn)無(wú)線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問(wèn)題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26