effective c++ -- 定制new和delete
这一章讲述了C++中的new和delete背后的一些机制,以及重写new和delete需要遵守的一些规则,以及什么时候适合重写new和delete以提高效率。
Item 49: 了解new-handler的行为
当operator new无法满足某一内存分配需求时,它会调用一个客户指定的错误处理函数,及new-handler,new-handler可能会为operator new找到足够的内存或者其他怎样以处理内存不足的情况,如果new-handler为空,operator new抛出异常。
通过set_new_handler来设置内存不足时调用的操作,它是声明于<new>的一个标准程序库函数:
Widget* pw = new (std::err) Widget;
时Widget构造函数抛出异常,C++运行期系统将自动调用与operator new相对应的版本来释放内存。所谓的“相对应的版本”,是指“参数个数和类型都与operator new相同”的某个operator delete,因此,当你定义了一个placement new时,你必须定义一个对应的placement delete,否则系统找不到对应的delete,无法执行内存回收工作,那么内存就泄漏了。
另外,operator new函数的名字匹配规则同一般的成员函数一样,如果你只在基类里声明了一个placement new,关于基类的new调用将无法使用正常版本;然后如果你又在继承自该基类的派生类里重新声明正常形式的new,基类的placement new也将不能默认作用在该派生类上。总之就是,operator new的名字匹配规则跟一般的成员函数是一样的。
placement delete只有在“伴随placement new调用而触发的构造函数”出现异常时才会被调用。
书中最后一章提醒了编译器warning的重要性,介绍了std::tr1及boost的一些基本东西。到此,这本书就总结完了。然后寒假也结束了~~~希望接下来的一学年好运吧。