- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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);
...
您可能关注的文档
- 普外科通读简略实用(Department of general surgery read through simple and practical).doc
- 普外科论文(Department of general surgery paper).doc
- 晋商文化 (对比(Shanxi Merchants culture (contrast)).doc
- 普桑常见的故障现象、损坏原因及维修(Poussin common fault phenomenon, damage reason and maintenance).doc
- 普洱功效(Pu'er tea).doc
- 普洱茶与绿茶的区别(The difference between Puer tea and green tea).doc
- 普洱茶减肥必看(Pu erh tea slimming must see).doc
- 普洱茶 中茶牌,黄印 绿印 红印(Pu'er Tea Zhongcha brand, India India India red yellow green).doc
- 普罗米修士受难的一日(The day of the crucifixion of the monks).doc
- 普通内科(General medicine).doc
- 福建农信2024客户经理练习卷附答案(一).docx
- 2025届江苏省宿迁市三校高三3月份第一次模拟考试英语试卷含解析.doc
- 辽宁省辽阳县集美学校2025届高三第二次模拟考试英语试卷含解析.doc
- 吉林省长春市榆树市2025届高考全国统考预测密卷英语试卷含解析.doc
- 江西省抚州市临川第一中学2025届高三下第一次测试语文试题含解析.doc
- 福建省晋江市平山中学2025届高三下学期第六次检测英语试卷含解析.doc
- 黑龙江省友谊县红兴隆管理局第一高级中学2025届高三下学期联考语文试题含解析.doc
- 山东省日照一中2025届高考冲刺模拟语文试题含解析.doc
- 江西省南昌五校2025届高三最后一卷语文试卷含解析.doc
- 江苏省太湖高级中学2025届高考语文倒计时模拟卷含解析.doc
文档评论(0)