Effective C++ Chapter8-定制new和delete

  • STL容器所使用的heap内存是由容器所拥有的分配器对象管理,而不是new和delete直接管理。本章不讨论。
49、了解new-handler的行为
  • 声明式尾端的"throw()"是一份异常明细,表示该函数不抛出任何异常,见29。
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 <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只是一个颇为局限的工具,因为它只适用于内存分配;后继的构造函数调用还是可能抛出异常。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容