您的位置:首页 > 编程语言 > C语言/C++

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

2012-03-08 14:37 288 查看
条款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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐