Effective C++ Chapter8-定制new和delete

  • STL容器所使用的heap内存是由容器所拥有的分配器对象管理,而不是new和delete直接管理。本章不讨论。
49、了解new-handler的行为
  • 声明式尾端的"throw()"是一份异常明细,表示该函数不抛出任何异常,见29。
Effective C++ Chapter8-定制new和delete_第1张图片
1.png
  • 一个设计良好的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 
#include 
 
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只是一个颇为局限的工具,因为它只适用于内存分配;后继的构造函数调用还是可能抛出异常。

你可能感兴趣的:(Effective C++ Chapter8-定制new和delete)