8 定制new和delete

 

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

想要替换编译器提供的operator new或operator delete三个理由

1 用来检测运用上错误 new后没有delete,或多次delete

2 强化效能 编译器的operator new和operator delete主要用于一般性,定制版的效果往往更好

3 收集使用上的统计数据

写一个定制型operator new十分简单  注意齐位,如果没有这个条件,可能导致运行期硬件异常;再者,齐位可能提高访问速度

 

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

       1 内存不足时,必需调用new-handling函数,必须有对付零内存的准备,还需避免掩盖正常形式的new。operator new返回值:有能力提供内存就返回一个指针指向内存,否则按条款49规则并抛出一个bad_alloc异常

       2 operator new实际不止一次尝试分配内存,在每次失败后调用new-handing函数,只有new-handing函数指针是null,operator new才会抛出异常。当要求分配内存size为0时,实际可能会分配一个字节内存返回,而不是空。

       operator new成员函数为某个特定class定制时,会被derived classes继承,需注意

注意:(1) operator new应该内存一个无穷循环,在其中尝试分配内存

 

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

Widget *pw = new Widget

共有两个函数被调用:一个是分配内存的operator new, 一个是Widget的default构造函数。若第一个调用成功,第二个抛出异常。需要将内存分配取消恢复旧观,否则会造成内存泄露。

placement new:其定义为operator new接受的参数除了size_t以外,还有其它。

void* operator new(std:size_t, void* pMemory) throw();

这个new的用途之一在负责在vector的未使用空间上创建对象

Widget* pw = new (std::cerr)Widget;

 

规则:如果一个带额外参数的operator new没有“带相同额外参数”的对应版operator delete,那么当new内存分配动作需要取消并恢复旧观时就没有任何operator delete会被调用,会造成内存泄露

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值