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好友分享! |