条款50 了解new和delete的合理替换时机
想要替换编译器提供的operator new或operator delete三个理由
1 用来检测运用上错误 new后没有delete,或多次delete
2 强化效能 编译器的operator new和operator delete主要用于一般性,定制版的效果往往更好
3 收集使用上的统计数据
写一个定制型operator new十分简单 注意齐位,如果没有这个条件,可能导致运行期硬件异常;再者,齐位可能提高访问速度
条款51 编写new和delete时需固守常规
1 内存不足时,必需调用new-handling函数,必须有对付零内存的准备,还需避免掩盖正常形式的new。operator new返回值:有能力提供内存就返回一个指针指向内存,否则按条款49规则并抛出一个bad_alloc异常
2 operator new实际不止一次尝试分配内存,在每次失败后调用new-handing函数,只有new-handing函数指针是null,operator new才会抛出异常。当要求分配内存size为0时,实际可能会分配一个字节内存返回,而不是空。
operator new成员函数为某个特定class定制时,会被derived classes继承,需注意
注意:(1) operator new应该内存一个无穷循环,在其中尝试分配内存
条款52:写了placement new也要写placement delete
Widget *pw = new Widget
共有两个函数被调用:一个是分配内存的operator new, 一个是Widget的default构造函数。若第一个调用成功,第二个抛出异常。需要将内存分配取消恢复旧观,否则会造成内存泄露。
placement new:其定义为operator new接受的参数除了size_t以外,还有其它。
void* operator new(std:size_t, void* pMemory) throw();
这个new的用途之一在负责在vector的未使用空间上创建对象
Widget* pw = new (std::cerr)Widget;
规则:如果一个带额外参数的operator new没有“带相同额外参数”的对应版operator delete,那么当new内存分配动作需要取消并恢复旧观时就没有任何operator delete会被调用,会造成内存泄露