C++箴言:理解new-handler的行为.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++箴言:理解new-handler 的行为 typedef void (*new_handler)(); new_handler set_new_handler(new_handler p) throw(); } 就像你能够看到的,new_handler 是一个指针的 typedef,这个指针 指向不取得和返回任何东西的函数,而 set_new_handler 是一个取得和 返回一个 new_handler 的函数。(set_new_handler 的声明的结尾处的 “throw() “是一个 exception specification (特别标准)。它根本上 是说这个函数不会抛出任何特别,尽管真相更好玩一些。关于细节,参见 《C++箴言:争取特别安全的代码》。) set_new_handler 的形参是一个指 向函数 的指针 ,这个 函数是 operator new 无法安排被恳求的内存时应当调用的。 set_new_handler 的返回值是一个指向函数的指针,这个函数是 set_new_handler 被调用 前有效的目标。 你可以像这样使用 set_new_handler: // function to call if operator new can”t allocate enough memory void outOfMem() { std::cerr “Unable to satisfy request for memory\n “; std::abort(); } int main() { std::set_new_handler(outOfMem); int *PBigDataArray = new int[100000000L]; ... } 假 如 operator new 不 能为 100,000,000 个 整 数 安排 空 间, outOfMem 将被调用,而程序将在发出一个错误信息后中止。(顺便说一句, 考虑假如在写这个错误信息到 cerr... 的过程中内存必需被动态安排会 发生什么。) 当 operator new 不 能满 意 一 个 内存 恳 求 时 , 它反 复 调 用 new-handler function 直到它能找到足够的内存。但是从这种高层次的 描述已足够推导出一个设计得好的 new-handler function 必需做到以 下事情之一: ·Make more memory available (使得更多的内存可用)。这可能使 得 operator new 中下一次内存安排的尝试胜利。实现这一策略的一个方 法是在程序启动时安排一大块内存,然后在 new-handler 第一次被调用 时释放它供程序使用。 ·Install a different new-handler (安装一个不同的 new-handler) 假如当前的 new-handler 不能做到使更多的内存可用,或许它知道有一 个不同的 new-handler 可以做到 假如是这样,当前的 new-handler 能 在 它 自 己 的 位 置 上 安 装 另 一 个 new-handler (通 过 调 用 set_new_handler)operator new 下一次调用 new-handler function 时, 它会得 到最近安装 的那一个 (这个 主线上 的一个 变化是让 一个 new-handler 转变它自己的行为,这样,下一次它被调用时,可以做一些 不同的事情。做到这一点的一个方法是让 new-handler 转变能影响 new-handler 行为的 static (静态),namespace-specific (名字空间专 用)或 global (全局)的数据) ·Deinstall the new-handler (卸载 new-handler),也就是,将空 指针传给 set_new_handler。没有 new-handler 被安装,当内存安排没 有胜利时,operator new 抛出一个特别 ·Throw an exception (抛出一个特别),类型为 bad_alloc 或继承 自 bad_alloc 的其它类型。这样的特别不会被 ope

文档评论(0)

182****9516 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档