//---------------------------------------------------------
//
//---------------------------------------------------------
1.新建C++工程或VC工程,默認的new_handler爲NULL
std::new_handler globalHandler = std::set_new_handler(NULL);
std::set_new_handler(globalHandler);
會發現globalHandler == NULL
2.基於知識點1
當operator new沒法知足某一內存分配需求時,因爲globalHandler == NULL,因此會拋出bad_alloc異常
3.operator new與new_handler的內在關係
void* operator new(std::size_t size) throw(std::bad_alloc)
{
while (true)
{
嘗試分配size bytes;
if (分配成功)
{
return (一個指針, 指向分配得來的內存)
}
// 分配失敗
new_handler globalHandler = set_new_handler(0);
set_new_handler(globalHandler);
if (globalHandler) (*globalHandler)();
else throw std::bad_alloc();
}
}
由以上的僞代碼能夠看出:
當operator new沒法知足內存申請而且new_handler不爲NULL時,它會不斷調用new_handler函數,直到找到足夠內存
而且new_handler爲NULL時,它會拋出bad_alloc異常函數