Effective C++改善程序与设计的55个具体做法 8. 定制new 和 delete

条款49: 了解 new-handler 的行为

set new handler 允许客户指定一个函数,在内存分配无法获得满足时被调用。

Nothrow new 是一个颇为局限的工具,因为它只适用于内存分配;后继的构造函数调用还是可能抛出异常。

个人理解:set_new_handler的参数是个指针,指向operator new无法分配足够内存时该被调用的函数,其返回值也是个指针,指向set_new_handler被调用前正执行的那个new-handler函数

条款 50: 了解 new 和 delete 的合理替换时机

许多理由需要写个自定的 new 和 delete ,包括改善效能、对 heap 运用错误进行调试、收集 heap 使用信息。

有以下情况时可能需要替换编译器提供的operator new和operator delete
1. 用来检测运行上的错误
2. 为了强化效能
3. 为了收集使用上的统计数据
4. 为了检测运用错误
5. 为了收集动态分配内存使用统计信息
6. 为了增加分配和归还速度
7. 为了降低缺省内存管理器代码的空间额外的开销
8. 为了弥补缺省分配器中的非最佳齐位
9. 为了相关对象成簇集中
10. 为了获得非传统行为

条款 51: 编写 new 和 delete 时需固守常规

operator new 应该内含一个无穷循环,并在其中尝试分配内存,如果它无法满足内存需求,就该调用 new-handler。它也应该有能力处理0 bytes 申请。 Class专属版本则还应该处理"比正确大小更大的(错误)申请。

operator delete 应该在收到 null 指针时不做任何事。 Class 专属版本则还应该处理"比正确大小更大的(错误)申请"。

条款 52: 写了 placement new 也要写 placement delete

当你写一个 placement operator new ,请确定也写出了对应的 placement operator delete。如果没有这样做,你的程序可能会发生隐微而时断时续的内存泄漏。

当你声明 placement new 和 placement delete,请确定不要无意识(非故意)地遮掩了它们的正常版本。

个人理解:重载了内存分配函数,也需要重载内存释放函数。这样资源才能被正确的回收

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值