13.4 耗尽内存

当operator new()找不到足够大的连续内存块来安排对象时,将会发生什么事情呢?一个称为new-handler的特殊函数将会被调用。首先,检查指向函数的指针,如果指针非0,那么它指向的函数将被调用。

new-handler的默认动作是产生一个异常(throw an exception),这个主题将在第2卷中介绍。然而,如果我们在程序里用堆分配,至少要用“内存已耗尽”的信息代替new-handler,并异常中断程序。用这个办法,在调试程序时会得到程序出了什么错误的线索。对于最终的程序,我们总想使之具有很强的容错恢复性。

通过包含new.h来替换new-handler,然后以想装入的函数地址为参数调用set_new_handler()函数。

13.4 耗尽内存 - 图1

13.4 耗尽内存 - 图2

new-handler函数必须不带参数且其返回值为void。while循环将持续分配int对象(并丢掉它们的返回地址)直到空的内存被耗尽。在紧接下去的下一次对new的调用时,将没有内存可被调用,所以调用new-handler。

new-handler的行为和operator new()绑在一起,如果已经重载了operator new()(在下一节中介绍),则new-handle将不会按默认调用。如果仍想调用new-handler,则我们不得不在重载了的operator new()的代码中加上做这些工作的代码。

当然,可以写更复杂的new-handler,甚至它可以回收内存[通常叫做无用单元收集器(garbage collector)]。但这不是编程新手的工作。