正如前面所说,operator new 的默认行为是请求分配内存,如果成功则返回此内存
地址,如果失败则调用一个 new_handler,然后再重复此过程于是,想要从 operator
new 的执行过程中返回,则必然需要满足下列条件之一:
于是,我们可以假设默认情况下 operator new 的行为是这样的:
void* operator new(size_t size)
{
void* p = null
while(!(p = malloc(size)))
{
if(null == new_handler)
throw bad_alloc();
try
{
new_handler();
}
catch(bad_alloc e)
{
throw e;
}
catch()
{}
}
return p;
}
在默认情况下,new_handler 的行为是抛出一个 bad_alloc 异常,因此上述循环只会
执行一次但如果我们不希望使用默认行为,可以自定义一个 new_handler,并使用
std::set_new_handler 函数使其生效在自定义的 new_handler 中,我们可以抛出异常,可
以结束程序,也可以运行一些代码使得有可能有内存被空闲出来,从而下一次分配时也
许会成功,也可以通过 set_new_handler 来安装另一个可能更有效的 new_handler 例如:
void MyNewHandler()
{
printf(New handler called!n);
throw std::bad_alloc();
}
std::set_new_handler(MyNewHandler);
这里 new_handler 程序在抛出异常之前会输出一句话应该注意,在 new_handler 的
代码里应该注意避免再嵌套有对 new 的调用,因为如果这里调用 new 再失败的话,可能
会再导致对 new_handler 的调用,从而导致无限递归调用这是我猜的,并没有尝试过
在编程时我们应该注意到对 new 的调用是有可能有异常被抛出的,因此在 new 的代
码周围应该注意保持其事务性,即不能因为调用 new 失败抛出异常来导致不正确的程序
逻辑或数据结构的出现例如:
class SomeClass
{