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異常函數

相關文章
相關標籤/搜索