set new handler 允许客户指定一个函数,在内存分配无法获得满足时被调用。
Nothrow new 是一个颇为局限的工具,因为它只适用于内存分配;后继的构造函数调用还是可能抛出异常。
个人理解:set_new_handler的参数是个指针,指向operator new无法分配足够内存时该被调用的函数,其返回值也是个指针,指向set_new_handler被调用前正执行的那个new-handler函数
许多理由需要写个自定的 new 和 delete ,包括改善效能、对 heap 运用错误进行调试、收集 heap 使用信息。
- 有以下情况时可能需要替换编译器提供的operator new和operator delete
- 1. 用来检测运行上的错误
- 2. 为了强化效能
- 3. 为了收集使用上的统计数据
- 4. 为了检测运用错误
- 5. 为了收集动态分配内存使用统计信息
- 6. 为了增加分配和归还速度
- 7. 为了降低缺省内存管理器代码的空间额外的开销
- 8. 为了弥补缺省分配器中的非最佳齐位
- 9. 为了相关对象成簇集中
- 10. 为了获得非传统行为
operator new 应该内含一个无穷循环,并在其中尝试分配内存,如果它无法满足内存需求,就该调用 new-handler。它也应该有能力处理0 bytes 申请。 Class专属版本则还应该处理"比正确大小更大的(错误)申请。
operator delete 应该在收到 null 指针时不做任何事。 Class 专属版本则还应该处理"比正确大小更大的(错误)申请"。
当你写一个 placement operator new ,请确定也写出了对应的 placement operator delete。如果没有这样做,你的程序可能会发生隐微而时断时续的内存泄漏。
当你声明 placement new 和 placement delete,请确定不要无意识(非故意)地遮掩了它们的正常版本。
个人理解:重载了内存分配函数,也需要重载内存释放函数。这样资源才能被正确的回收。