effective C++笔记之条款9、10:避免隐藏标准形式的new、如果写了operator new 就要同时写operator delete

条款9: 避免隐藏标准形式的new

l        当在类里增加了一个带多个参数的operator new函数。可能会调用不到全局(标准)的new,这时就会出错。

l        两个办法:在类里写一个支持标准形式的operator new,它和标准new做同样的事。可用一个高效的内联函数来封装实现;为每一个增加到operator new的参数提供缺省值。

l        无论用哪种方法,如果以后想对“标准形式”的new制定新的功能,只需要重写这个函数。调用者编译链接后就可以使用新功能了。

 

条款 10:如果写了operator new 就要同时写operator delete

l        写自己的operator new和 operator delete是为了效率。在那些需要动态分配大量的但很小的对象的应用程序里,情况更是如此。

l        当调用operator new来分配一个类对象时,得到的内存可能会更大一些。因为operator new和operator delete之间要互相传递信息。operator delete想要知道释放的内存有多大,就必须知道当初operator new分配的内存有多大。一种常用的方法是让operator new告诉operator delete当初分配的内存大小是多少。这样做很奢侈。

l        如果为类专门写一个operator new,就可以利用每个类对象的大小相等的特点,不必在每个分配的内存块上附带信息了。里面的::operator new调用分配内存失败,会调用new-heandler函数,不需要在类的operator new中处理,隐藏在::operator new中。

l        对于大量的小对象动态分配的情况,可以考虑使用内存池。::operator new返回的内存块是从来没有被释放。但内存池和内存泄漏有一个重要的不同之处。内存泄漏会无限地增长,即使客户循规蹈矩;而内存池的大小绝对不会超过客户请求内存的最大值。

l        自定义的内存管理程序可以很好的改善程序的性能,而且可以封装在象Pool这样的类里。但operator new 和 operator delete需要同时工作,写了operator new,就要写operator delete。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值