正文
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ù))。
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(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模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26