49.了解new-handler的行为
如上所述,当operator new想要分配内存但未获满足时,会抛出一个异常。但在此之前,会调用一个客户指定的错误处理函数,一个所谓的new-handler,为了指定这个用以处理内存不足的函数,客户必须调用set-new-handler函数,这是一个声明于头文件<new>中的一个标准库函数。
其在头文件中的定义如下:
下面给出一个如何使用它的范例:
若程序不能为其分配所要求的内存空间,则函数no_memory()会被调用。
一个设计良好的new-handler函数应当完成以下工作:
一般我们使用类对象管理它,这里给出一例:
当然,我们也可以设计一个基类完成该功能,只需让那些需要自己管理内存的类继承它就好。
当然,还有另一种处理方式—旧式的nothrow形式,传统地分配失败便返回NULL,但它只适用于内存分配,后继构造函数仍然可能抛出异常。
50.了解new和delete的合理替换时机
我们出于以下三个目的可能会想要替换编译器自带的new与delete
一个定制new的实现:
但它有一个显著问题:未适当对齐(相对指针偏移了一个int),可能导致程序崩溃。
51.编写new和delete时需固守常规
52.写了placement new也要写placement delete
如若重载了操作符new或delete,并接受额外参数(如size,fstream),该new或delete便称为placement new与placement delete
示例: