正文

回到頂部

1. new-handler介紹

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

1.1 調用set_new_handler來指定全局new-handler

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

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

 

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

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

網(wǎng)友評論