C++ 了解new-handler的行为

原创 2018年04月17日 09:05:40

20180408 C++ 了解new-handler的行为


当operator new 无法满足某一个内存分配需求时,他会抛出异常,以前他会返回一个null指针,某些旧式编译器目前也还这么做。




当operator new 抛出异常以反映一个未获满足的内存需求之前,他会先调用一个客户指定的错误处理函数,一个所谓的new-handler,为了指定这个函数,客户必须调用set_new_handler,这个函数是声明于<new>的一个标准程序库函数:


namespace std
{
  typedef void (*new_handler)();
  new_handler set_new_handler(new_handler p) throw();
}




上述代码中,new_handler是个typedef,定义了一个指针指向函数,该函数没有参数也不返回任何东西,set_new_handler则是“获得一个new_handler并返回一个new_handler”的函数,set_new_handler声明式尾端的“throw()”是一份异常明细,表示该函数不抛出任何异常(虽然事实更有趣些)。


set_new_handler的参数是一个指针,指向 operator new无法分配足够内存时该被调用的函数。其返回值也是个指针,指向  set_new_handler被调用前正在执行(但马上要被替换)的那个 new_handler函数。
可以这样使用new-handler:


//以下是当operator new无法分配足够内存时,该被调用的函数
void outOfMem()
{
  std::cerr<<"Unable to satisfy request for memory\n";
  std::abort();
}


int main()
{
  std::set_new_handler(outOfMem);
  int* pBigDataArray = new int[100000000L];
  ...
}


就本例而言,若operator new无法为100000000个整数分配足够空间,会被调用,于是程序在发出一个信息之后夭折。




当operator new 无法满足内存申请时,他会不断调用new-handler函数,直到找到足够内存,引起反复调用的代码这里不再赘述,设计良好的new-handler函数必须做以下事情:
(1)让更多内存可被调用:这就是造成oprator new 里的下一次内存分配动作可能造成成功。
(2)安装另一个new-handler:若目前这个new-handler无法取得更多可用内存,或许他知道另外哪个new-hanlder有此能力。
(3)卸除new-handler:也就是将null指针传给set_new_handler。
(4)抛出bad_alloc(或派生自bad_alloc)的异常:这样的异常不会被operator new捕捉,因此会被传播到内存索求处。
(5)不返回,通常调用abort或exit。


这些选择让你在实现new-handler函数时拥有很大弹性。






现在,假设你打算处理Widget类的内存分配失败情况,即:
class Widget
{
public:
  static std::new_handler set_new_handler(std::new_handler p) throw();
  static void* operator new(std::size_t size) throw(std::bad_alloc);
private:
  static std::new_handler currentHandler;
};


Static成员必须在类的定义式之外定义,即:
std::new_handler Widget::currentHandler = 0;
                         //在类实现文件里初始化为null




/*******************剩下的都没看懂**********************/


























































































条款49:了解new-handler的行为

/*条款49:了解new-handler的行为*/ #include using namespace std; //operator new 当无法满足某一内在分配需求时,它会抛出异常,返回NULL指...
  • sbfksmq
  • sbfksmq
  • 2015-09-29 12:49:47
  • 175

《Effective C++》:条款49:了解new-handler的行为

C++内存是由程序员手动管理的,不像Java或.net有垃圾回收机制。C++内存管理主要是分配例程和归还例程(allocation and deallocation routines),即operat...
  • KangRoger
  • KangRoger
  • 2015-03-15 21:03:46
  • 1471

C++之了解new-handler的行为(49)---《Effective C++》

条款49:了解new-handler的行为了解C++内存管理例程,即了解分配例程和归还例程(operator new和operator delete),同时还需要了解配角new-handler,这是当...
  • u014038273
  • u014038273
  • 2017-08-15 20:25:38
  • 106

Effective C++ 条款49:了解new-handler的行为

当operator new无法满足某一内存分配需求时,他会爬
  • xlf13872135090
  • xlf13872135090
  • 2014-08-24 12:22:46
  • 423

了解new-handler的行为

1.新建C++工程或VC工程,默认的new_handler为NULLstd::new_handler globalHandler = std::set_new_handler(NULL); std::...
  • wangyao1052
  • wangyao1052
  • 2015-04-18 20:21:36
  • 332

条款49 了解new-handler的行为

#include "stdafx.h" #include #include void OutOfMenory(){ std::cerr
  • yvhqbat
  • yvhqbat
  • 2015-11-03 19:19:10
  • 254

Effective C++ 条款 49:了解new-handler的行为

(一) new_handler函数:当operator new或operator new[]分配内存失败时调用的函数。 set_new_handler函数:试图分配更多内存以足够使用,...
  • u010470972
  • u010470972
  • 2014-09-28 21:17:35
  • 437

effective C++ 条款 49:了解new-handler的行为

当operator new无法满足某一内存分配需求时,会抛出异常。再抛出异常以反映一个未获满足的内存需求之前,它会先调用客户指定的错误处理函数,new-handler。为了指定这个“用以处理内存不足”...
  • happylife1527
  • happylife1527
  • 2012-11-20 12:53:41
  • 232

条款49:了解new-handler的行为

    条款49:了解new-handler的行为    Understand the behavior of the new-handler.        在我们平时的编写代码过程中,总是避免不了...
  • scofieldzhu
  • scofieldzhu
  • 2009-10-26 16:04:00
  • 669

Effective C++ — 条款49:了解new-handler的行为

了解new-handler的行为 当operator new无法满足某一内存分配需求时
  • Dawn_sf
  • Dawn_sf
  • 2017-12-11 15:53:39
  • 107
收藏助手
不良信息举报
您举报文章:C++ 了解new-handler的行为
举报原因:
原因补充:

(最多只允许输入30个字)