zoukankan      html  css  js  c++  java
  • Effective C++笔记之Item49【了解new-handler的行为】

    //---------------------------------------------------------
    //
    //---------------------------------------------------------
    1.新建C++工程或VC工程,默认的new_handler为NULL
      std::new_handler globalHandler = std::set_new_handler(NULL);
      std::set_new_handler(globalHandler);
      会发现globalHandler == NULL
    2.基于知识点1
      当operator new无法满足某一内存分配需求时,由于globalHandler == NULL,所以会抛出bad_alloc异常
    3.operator new与new_handler的内在关系
      void* operator new(std::size_t size) throw(std::bad_alloc)
      {
          while (true)
       {
           尝试分配size bytes;
        if (分配成功)
        {
            return (一个指针, 指向分配得来的内存)
        }
       
        // 分配失败
        new_handler globalHandler = set_new_handler(0);
        set_new_handler(globalHandler);
       
        if (globalHandler) (*globalHandler)();
        else throw std::bad_alloc();
       }
      }
      由以上的伪代码可以看出:
      当operator new无法满足内存申请并且new_handler不为NULL时,它会不断调用new_handler函数,直到找到足够内存
                                    并且new_handler为NULL时,它会抛出bad_alloc异常

  • 相关阅读:
    bzoj4804
    bzoj2962
    bzoj4827
    bzoj2553
    bzoj3611
    BZOJ 1636: [Usaco2007 Jan]Balanced Lineup
    BZOJ 1635: [Usaco2007 Jan]Tallest Cow 最高的牛
    BZOJ 1634: [Usaco2007 Jan]Protecting the Flowers
    BZOJ 1631: [Usaco2007 Feb]Cow Party
    BZOJ 2582: [Usaco2012Jan]Bovine Alliance
  • 原文地址:https://www.cnblogs.com/Hisin/p/3152925.html
Copyright © 2011-2022 走看看