1993年前,c++一直要求在内存分配失败时operator new要返回0,现在则是要求operator new抛出std::bad_alloc异常。很多c++程序是在编译器开始支持新规范前写的。c++标准委员会不想放弃那些已有的遵循返回0规范的代码,所以他们提供了另外形式的operator new(以及operator new[])以继续提供返回0功能。这些形式被称为“无抛出”,因为他们没用过一个throw,而是在使用new的入口点采用了nothrow对象: [cpp] view plaincopy
operator new默认情况下如果不能满足内存分配请求时会抛出的异常类型std::bad_alloc。因此,如果你不愿意看到诸如:widget* pw2 = new (nothrow) widget; 这样带着nothrow的operator new,最简单的方法是使用set_new_handler自定义newhandler函数。最简单的例子如下: [cpp] view plaincopy
newhandlerfunc函数中没有参数也没有返回值,可提供的信息有限,这样的全局通用函数在c++项目中所能起的作用不大。所以,鉴于c++本身的面向对象的设计,我们考虑每个类有自己的newhandler,与全局的newhandler共存。比较简单的例子如下: [cpp] view plaincopy
如果每个类都这样地写一遍,感觉有些代码重复,所以可能想到会写一个基类,让所有的子类可以继承set_new_handler和operator new功能,但要使每个子类有不同的currenthandler数据成员,一个比较简单的方法就是设计一个模板。 [cpp] view plaincopy
[cpp] view plaincopy
|
|