一、函数说明
当operator new()找不到足够大的连续内存块来安排对象。new-handler函数将会被调用。
typedef void (*new_handler)();
new_handler set_new_handler(new_handler p)throw();
new_handler是个typedef,定义出一个指针指向函数,该函数没有参数也不返回任何东西。set_new_handler则是设置新的new_handler并返回当前的new_handler。当operator new()无法分配内存足够内存时新设置的new_handler被调用。
二、使用说明
1、如果set_new_handler()的参数设置为0(即没有安装任何new_handler),operator new会在内存分配不成功时抛出异常。
2、可以将set_new_handler函数中的参数p设为0,来获取当前的new_handler;
#include<iostream>
using namespace std;
void outofMem()
{
abort();
}
int main( )
{
new_handler p=set_new_handler(outofMem);
new_handler p1=set_new_handler(0);
cout<<outofMem<<" "<<p1<<endl;
return 0;
}
3、当operator new无法满足内存申请时,它会不断调用new_handler函数,直到找到足够内存或者退出。因此new_handler函数必须至少做以下事情之一或者组合:
(1)让更多内存可被使用:可以在程序一开始执行就分配一大块内存,然后new-handler第一次被调用时,将它们还给程序使用。
(2)安装另一个new_handler。如果当前的new_handler无法获取更多内存,它可以安装另外具有此能力的new_handler.
(3)卸除new_handler。将null指针传给set_new_handler()。这样在operator new内存分配不成功时会抛出异常。
(4)抛出bad_alloc(或派生自bad_alloc的异常)
(5)不返回。调用abort或者exit。
4、C++不支持类专属的new_handlers。因此如果想要让类对象内存分配错误时调用自己的new_handler,可以给类提供自己的set_new_handler和operator new。
5、new-handler的行为于operator new()绑在仪器,如果已经重载了operator new(),则new-handler将不会按默认调用。如果仍想调用new-handler则我们必须在重载了的operator new()的代码中加上这些工作的代码。
参考资料:
1、《C++编程思想》
2、《Effective C++》