ize) throw(std::bad_alloc){ NewHandlerHolder h(std::set_new_handler(current)); return ::operator new(size); }
有了这个模板基类后,给Widget
添加”new-handler”支持只需要public继承即可:
class Widget: public NewHandlerSupport
{ ... };
其实NewHandlerSupport
的实现和模板参数T
完全无关,添加模板参数是因为handler
是静态成员,这样编译器才能为每个类型生成一个handler
实例。
nothrow new
1993年之前C++的operator new
在失败时会返回null
而不是抛出异常。如今的C++仍然支持这种nothrow的operator new
:
Widget *p1 = new Widget; // 失败时抛出 bad_alloc 异常
assert(p1 != 0); // 这总是成立的
Widget *p2 = new (std::nothrow) Widget;
if(p2 == 0) ... // 失败时 p2 == 0
“nothrow new” 只适用于内存分配错误。而构造函数也可以抛出的异常,这时它也不能保证是new
语句是”nothrow”的。