条款49:了解new-handle的行为
- new-handle客户指定的内存分配错误函数
- set_new_handle函数用来设置new_handle函数
1 namespace std {
2 typedef void(*new_handle)();
3 new_handle set_new_handler(new_handle p) throw();
4 }
条款50:了解new和delete的合理提换时机
- 检测内存错误
- 强化效能
- 收集内存分配使用的数据
- 等等
条款51:编写new和delete时需固守常规
- 自定义的new应该内含一个无穷循环,在其中尝试分配内存,如果失败,就该调用new-handler以退出循环。同时它应该有能力处理0 bytes的申请(可以简单判断并改为1bytes)。Class专属版本还要处理衍生类的申请,不要直接调用基类的(大小不同),可以判断并转调普通的new函数。
- 自定义的delete应该可在收到null指针时不做任何事,Class专属版本还应该处理衍生类的申请,不要直接调用基类的(大小不同),可以判断并转调普通的delete函数。
条款52:写了placement new也要写placement delete
- 关于placement new和placement delete参见《More Effective C++》 条款八:operator new和new operator
- 当创建对象时,会先进行new,然后调用构造函数,如果构造出现异常,就需要delete,否则内存泄漏。如果用了placement new,那么编译器会寻找含有同样参数的placement delete,否则不会delete,因此必须成对写接收同样参数的placement new和placement delete。同时,为了让用户主动使用delete时能进行正确操作,你需要同时定义一个普通形式的delete,来执行和placement delete同样的特殊实现。
- C++在global作用域内提供了不同形式的operator new,如果在class内声明任何operator news,会掩盖自动提供的operator new。