网站大量收购独家精品文档,联系QQ:2885784924

条款8写operator new和operator delete时要遵循常规(条款8 写operator new和operator delete时要遵循常规).doc

条款8写operator new和operator delete时要遵循常规(条款8 写operator new和operator delete时要遵循常规).doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
条款8写operator new和operator delete时要遵循常规(条款8 写operator new和operator delete时要遵循常规)

条款8写operator new和operator delete时要遵循常规(条款8 写operator new和operator delete时要遵循常规) 条款8: 写operator new和operator delete时要遵循常规 自己重写operator new时 (条款10解释了为什么有时要重写它), 很重要的一点是函数提供的行为要和系统缺省的operator new一致.实际做起来也就是: 要有正确的返回值; 可用内存不够时要调用出错处理函数 (见条款7); 处理好0字节内存请求的情况.此外, 还要避免不小心隐藏了标准形式的new, 不过这是条款9的话题. 有关返回值的部分很简单.如果内存分配请求成功, 就返回指向内存的指针; 如果失败, 则遵循条款7的规定抛出一个std:: Bad _ alloc类型的异常. 但事情也不是那么简单.因为operator new实际上会不只一次地尝试着去分配内存, 它要在每次失败后调用出错处理函数, 还期望出错处理函数能想办法释放别处的内存.只有在指向出错处理函数的指针为空的情况下, new才抛出异常 Operator. In addition, C + + 标准要求, 即使在请求分配0字节内存时, Operator new也要返回一个合法指针. (实际上, 这个听起来怪怪的要求确实给c + + 语言其它地方带来了简便) 这样, 非类成员形式的operator new的伪代码看起来会象下面这样: Void * Operator New (size t size _) / / operator new还可能有其它参数 { If (size = = 0) {/ / 处理0字节请求时, Size = 1; / / 把它当作1个字节请求来处理 } While (1) { 分配size字节内存; If (分配成功) Return (指向内存的指针); / / 分配不成功, 找出当前出错处理函数 New _ handler globalhandler = set _ New _ handler (0); Set _ New _ handler (globalhandler); If (globalhandler) (* globalhandler) (); Else throw std:: Bad _ Alloc (); } } 处理零字节请求的技巧在于把它作为请求一个字节来处理.这看起来也很怪, 但简单, 合法, 有效.而且, 你又会多久遇到一次零字节请求的情况呢? 你又会奇怪上面的伪代码中为什么把出错处理函数置为0后又立即恢复.这是因为没有办法可以直接得到出错处理函数的指针, 所以必须通过调用set _ New _ handler来找到.办法很笨但也有效. 条款7提到operator new内部包含一个无限循环, 上面的代码清楚地说明了这一点 -- while (1) 将导致无限循环.跳出循环的唯一办法是内存分配成功或出错处理函数完成了条款7所描述的事件中的一种: 得到了更多的可用内存; 安装了一个新的new handler (出错处理函数); 卸除了new Handler; 抛出了一个std:: Bad _ alloc或其派生类型的异常; 或者返回失败.现在明白了为什么new - handler必须做这些工作中的一件.如果不做, new里面的循环就不会结束 Operator. 很多人没有认识到的一点是operator new经常会被子类继承.这会导致某些复杂性.上面的伪代码中, 函数会去分配size字节的内存 (除非size为0).Size很重要, 因为它是传递给函数的参数.但是大多数针对类所写的operator New (包括条款10中的那种) 都是只为特定的类设计的, 不是为所有的类, Nor is it designed for all its subclasses. This means that for a class of X operator new, the behavior within the function is accurate sizeof (x) when it comes to the objects large size: its neither big nor small. Because of inheritance, however, the operator new in the base class may be called to allocate memory for a subclass object: Class base { Public: Static void * operator new (size_t size); ...

您可能关注的文档

文档评论(0)

jgx3536 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档