卸除new-handler。也是传递空指针给set_new_handler。没有安装new-handler,operator new分配内存不成功时会抛出一个标准的std::bad_alloc类型的异常。

  ● 抛出std::bad_alloc或从std::bad_alloc继承的其他类型的异常。这样的异常不会被operator new捕捉,所以它们会被送到初进行内存请求的地方。(抛出别的不同类型的异常会违反operator new异常规范。规范中的缺省行为是调用abort,所以new-handler要抛出一个异常时,一定要确信它是从std::bad_alloc继承来的。想更多地了解异常规范,参见条款m14。)

  没有返回。典型做法是调用abort或exit。abort/exit可以在标准c库中找到(还有标准c++库,参见条款49)。

  上面的选择给了你实现new-handler函数极大的灵活性。

  处理内存分配失败的情况时采取什么方法,取决于要分配的对象的类:


class x {
public:
 static void
 outofmemory();
 
 ...
 
};

class y {
public:
 static void outofmemory();
 
 ...
 
};

x* p1 = new x; // 若分配成功,调用x::outofmemory
y* p2 = new y; // 若分配不成功,调用y::outofmemory
 


  c++不支持专门针对于类的new-handler函数,而且也不需要。你可以自己来实现它,只要在每个类中提供自己版本的set_new_handler和operator new。类的set_new_handler可以为类指定new-handler(象标准的set_new_handler指定全局new-handler一样)。类的operator new则保证为类的对象分配内存时用类的new-handler取代全局new-handler。

  假设处理类x内存分配失败的情况。因为operator new对类型x的对象分配内存失败时,每次都必须调用出错处理函数,所以要在类里声明一个new_handler类型的静态成员。那么类x看起来会象这样:


class x {
public:
 static new_handler set_new_handler(new_handler p);
 static void * operator new(size_t size);
 
private:
 static new_handler currenthandler;
};


  类的静态成员必须在类外定义。因为想借用静态对象的缺省初始化值0,所以定义x::currenthandler时没有去初始化。


new_handler x::currenthandler; //缺省设置currenthandler为0(即null)


  类x中的set_new_handler函数会保存传给它的任何指针,并返回在调用它之前所保存的任何指针。这正是标准版本的set_new_handler所做的:


new_handler x::set_new_handler(new_handler p)
{
 new_handler oldhandler = currenthandler;
 currenthandler = p;
 return oldhandler;