Effective C++ 8,9

8.写operator new 和 operator delete 时要遵循常规。


operator new要与系统缺省的operator new  操作一致。即有正确的返回值,内存不够时要调用出错处理函数,处理好0字节内存请求的情况,避免隐藏标准形式的new。

new会多次的尝试分配内存,寄希望与每次失败后执行的出错处理函数能释放其他地方的内存以供使用。只有在出错处理函数指针为空的情况下,new才抛出异常。new在请求分配0字节内存时也要返回一个合法的指针,一般情况下,c++会将0字节认为为一个字节大小。

operator new会经常被派生类调用,所以要么在派生类中重载一个新的new,或者在基类中new函数中做一些判断,因为派生类的大小很可能与基类大小不同,而且sizeof()大小为0的情况下会返回值为1。

如果想要控制基于类的数组的内存分配,必须实现operator new[] 。

对于operator delete ,更加简单一点。对于空指针的删除永远是安全的。剩下的只要考虑增加继承支持就行了。


9.避免隐藏标准形式的new。

内部声明的名称会隐藏掉外部范围相同的名称。如果类中只重载了操作符new,如下:

	static void* operator new (size_t size,new_handler p);//p为出错处理函数
而在新建对象时,

	B *b1 = new (noMoreMemory)B;
	B *b2 = new B;
前者正确,但后者就错误了,错误原因为此函数隐藏了 operator new,即使对于后者,其参数与函数参数不相符合,其错误提示即参数不符。

解决的方法有两种:

重载标准new调用方式operator new。

对每一个增加到operator new中的参数提供缺省值 如 

static void* operator new (size_t size,new_handler p = 0);


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值