写在前面
在operator new或者operator new[]内存分配失败时,会不止一次调用由client指定的handler(当然handler也有默认形式),可以有源码中发现
void* operator new(size_t size,const std::nothrow_t&)_THROW0()
{
void* p;
while((p==malloc(size))==0)
{
_TRY_BEGIN
if(_callnewh(size)==0) break;
_CATCH(std::bad_alloc) return (0);
_CATCH_END
}
return (p);
}
这里面的_callnewh就是我们定义的new_handler
new_handler函数
new_handler函数原型为:
typedef void (*new_handler)();
这是一个没有参数返回值为void类型的typedef,用作set_new_handler的参数和返回值类型
set_new_handler函数
函数原型为:
new_handler set_new_handler (new_handler new_p) throw(); //c++98
new_handler set_new_handler (new_handler new_p) noexcept; //c++11
将new_handler类型的new_p设为new 处理函数