1. 在使用operator new申請記憶體失敗後,編譯器並不是不做任何的努力直接丟擲std::bad_alloc異常,在這之前,它會呼叫乙個錯誤處理函式(new_handler)。
2. new_handler函式的處理方式策略:
(1)operator new會進行多次的記憶體分配嘗試,這可能會使其下一次的記憶體分配嘗試成功。在程式啟動時分配一大塊記憶體,然後在new_handler第一次被呼叫時釋放它供程式使用。
(2)如果當前的new_handler不能獲得更多的記憶體供operator new分配使用,但另乙個new_handler卻可以做到,則呼叫set_new_handler在自己的位置上安裝另乙個new_handler,當operator new下一次呼叫new_handler時,它會呼叫最新安裝的那乙個。
(3)將空指標傳給set_new_handler,解除安裝new_handler。此時,當記憶體分配失敗時,operator new則會丟擲乙個異常。
(4)丟擲乙個型別為bad_alloc或繼承自bad_alloc的其他型別的異常。
(5)直接呼叫abort或exit結束應用程式。
3. set_new_handler的返回值是乙個指向函式的指標,指向的是set_new_handler呼叫之前的異常處理函式。
4. new_handler必須有主動退出功能,否則就會導致operator new內部死迴圈,new_handler的一般形式:
void memerrorhandling()
// 一下任一種方式主動退出:
// abort/exit 直接退出程式
// 或set_new_handler(其他new_handler)
// 或set_new_handler(null)
// 或throw bad_alloc()或其派生類
}
5. 根據被分配物件的不同,採用不同的方法對記憶體分配失敗進行處理:
// 需要為每乙個class提供專屬的:
// set_new_handler
// operator new
// new_handler型別的靜態成員
// 將其設定為類的new-handler處理函式
class a
;std::new_handler a::m_curhandler = null;
std::new_handler a::set_new_handler(std::new_handler p) throw()
void a::memoryerrorhandling()
void * a::operator new(std::size_t size) throw(std::bad_alloc)
了解new handler的行為
1.當operator new 無法滿足某一記憶體需求時,他會丟擲異常。以前它會返回乙個null指標,一些老的編譯器目前也會這樣做。當operator new 丟擲異常以反映乙個為滿足的記憶體需求之前,它會先呼叫乙個客戶指定的錯誤處理函式,乙個所謂的new handler。當operator new...
new handler 問題的筆記
void outofmem int main 不太懂這裡為什麼呼叫 set new handler就能儲存outofmem 感覺好奇怪,看了下vs裡面原始碼發現了 handler.cpp set new handler for microsoft include typedef int cdecl ...
我所了解的cgi
對於cgi,一開始我並沒有理解,一些概念性的東西,常常使我陷入咬文嚼字的陷阱裡。我希望找到乙個通俗易懂的案例,下面這段資料我個人覺得講得非常清楚 最早的web伺服器簡單地響應瀏覽器發來的http請求,並將儲存在伺服器上的html檔案返回給瀏覽器,也就是靜態html。事物總是不斷發展,也越來越複雜,所...