内容简介:作者:LogM本文原载于
作者:LogM
本文原载于 https://segmentfault.com/u/logm/articles ,不允许转载~
8. 定制new和delete
-
8.1 条款49:了解new-handler的行为
- new-handler相当于new的异常处理函数。new申请内存发生异常,调用new-handler处理,处理完了之后继续尝试new,如果还是出错,继续调用new-handler,以此反复。
-
//标准库对于new-handler是这么写的: //new_handler被定义成一个函数指针 //set_new_handler函数的参数是个指针,指向new无法分配足够内存时应该调用的函数; //set_new_handler函数的返回值是个指针,指向set_new_handler之前设置的new_handler函数 namespace std { typedef void (*new_handler)(); new_handler set_new_handler(new_handler p) throw(); } //可以这样使用set_new_handler void oufOfMem() { std::cerr << "Unalbe to new\n"; std::abort(); } int main() { std::set_new_handler(outOfMem); int * pBigArray = new int[10000000000L]; } -
一般来说,new-handler函数会做以下事情的某几件:
- a. 让更多内存可被使用。使得再次尝试new能成功。
- b. 安装另一个new-handler。使用更强力的new-handler处理。
- c. 卸载new-handler。实在不行,卸载new-handler使new抛出异常。
- d. 抛出bad_alloc的异常。
- e. 退出程序。abort()或exit()。
-
8.2 条款50:了解new和delete的合理替换时机
- 这部分讲的是:如果你觉得编译器自带的new和delete不好用,应该怎么写一个自定义的函数替换。
- 作者自己也提到了,要自定义new和delete不是简单写个函数就好了,内存的申请和释放会涉及到计算机体系架构中比较底层的东西,比如"内存对齐"。所以重头开始写new和delete是比较复杂的,可以买现成的商业产品,或者在开源代码上修改。
-
8.3 条款51:编写new和delete时需要固守常规
- 条款50已经说明了,自定义new和delete比较复杂,非必要不建议重写。
-
这部分讲了自定义new和delete时需要注意的事项:
- operator new应该内含一个无穷循环,并在其中尝试分配内存,分配不了,调用new-handler。
- operator new对0 bytes的内存申请,也需要正常返回指针。
- operator delete应该在收到null指针时不做任何事。
-
8.4 条款52:写了placement new也要写placement delete
-
Widget* pw = new Widget //这句话中总共有2个函数被调用:1.operator new分配内存;2.Widget的构造函数 //当调用Widget构造函数发生异常时,需要delete掉第一步new出来的内存 //如果使用C++自带的new和delete,这个情况不需要用户考虑;如果是自定义new和delete,需要用户考虑
-
以上所述就是小编给大家介绍的《【读书笔记】Effective C++(08)定制new和delete》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Beautiful Code
Greg Wilson、Andy Oram / O'Reilly Media / 2007-7-6 / GBP 35.99
In this unique work, leading computer scientists discuss how they found unusual, carefully designed solutions to difficult problems. This book lets the reader look over the shoulder of major coding an......一起来看看 《Beautiful Code》 这本书的介绍吧!