- STL容器所使用的heap内存是由容器所拥有的分配器对象管理,而不是new和delete直接管理。本章不讨论。
49、了解new-handler的行为
- 声明式尾端的"throw()"是一份异常明细,表示该函数不抛出任何异常,见29。
- 一个设计良好的new_handler必须做以下事情:
1、让更多的内存可被使用
2、安装另一个new-handler。(只要调用set_new_handler函数)
3、卸除new-handler,也就是将null指针传递给set_new_handler。一旦没有安装在任何new-handler,operater new 会在内存分配不成功时候抛出异常。
4、抛出bad_alloc(或派生自bad_alloc)的异常,这样的异常不会被operater new捕捉,因此会被传播到内存索引处。
5、不返回,通常调用abort或exit。
#include <midstream>
#include <new>
void handler()
{
std::cout << "Memory allocation failed, terminating\n";
std::set_new_handler(nullptr);//注释掉这句,在运行试试!
}
int main()
{
std::set_new_handler(handler);
try {
while (true) {
new int[100000000ul];
}
} catch (const std::bad_alloc& e) {
std::cout << e.what() << '\n';
}
}
- widget
- static成员必须在class定义式之外被定义(除非它们是const而且是整型,见2)
*请记住:
1、set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用。
2、Nothrow new只是一个颇为局限的工具,因为它只适用于内存分配;后继的构造函数调用还是可能抛出异常。