background image

正如前面所说,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
{