当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

C++箴言:理解new-handler的行为[VC/C++编程]

赞助商链接



  本文“C++箴言:理解new-handler的行为[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

当 operator new 不能满意一个内存分配恳求时,它抛出一个 exception(非常).好久从前,他返回一个 null pointer(空指针),而一些对比老的编译器还在这样做.你仍然能到达从前的目的(在一定程度上),但是我要到本文的最后再谈论它.

在 operator new 因回应一个无法满意的内存恳求而抛出一个 exception 之前,它先调用一个可以由客户指定的被称为 new-handler 的 error-handling function(错误处理函数).(这并不完好切当,operator new 真正做的事情比这个略微复杂一些,具体细节将在下一篇文章中谈论.)为了指定 out-of-memory-handling function,客户调用 set_new_handler ——一个在 <new> 中声明的尺度库函数:

namespace std {
 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
";
 std::abort();
}
int main()
{
 std::set_new_handler(outOfMem);
 int *pBigDataArray = new int[100000000L];
 ...
}

假如 operator new 不能为 100,000,000 个整数分配空间,outOfMem 将被调用,而程序将在发出一个错误信息后中止.(趁便说一句,考虑假如在写这个错误信息到 cerr... 的历程中内存必须被动态分配会发生什么.)


  以上是“C++箴言:理解new-handler的行为[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: 与您的QQ/BBS好友分享!
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .