转:Set_New_Handler()

当运算符new找不到足够大的连续内存块来为对象分配内存时将会发生什么?一个称为 new-handler的函数被调用。

对于new-handler的缺省动作是抛出一个异常。然而,如果我们在程序里用堆分配,至少要用“内存已用完”的信息代替 new-handler,并异常中断程序。用这个办法,在调试程序时会得到程序出错的线索。

通过包含NEW. H,然后以我们想装入的函数地址为参数调用set_new_handler( )函数,这样就替换了new-handler。

typedef void (*new_handler)();

new_handler set_new_handler(new_handler p) throw();

set_new_handler是一个输入并返回new_handler类型的函数。set_new_handler的输入参数是operator new分配内存失败时要调用的出错处理函数的指针,返回值是set_new_handler没调用之前就已经在起作用的旧的出错处理函数的指针。

#include<new.h>

#include<iostream.h>

#include<stdlib.h>

void __cdecl newhandler()

{

   cout << "The new_handler is called:" << endl;

   throw bad_alloc();

   return;

}

 

//__cdecl程序的压栈方式为C风格
//__stdcall为PASCAL风格
//举个例子:
//(1)   C函数  Fun1(a,b,c)
 //  函数调用时,参数压栈顺序为 c , b , a
//(2)   PASCAL函数 Fun(a,b,c)
 // 函数调用时,参数压栈顺序为 a, b , c

 

int main()

{

   set_new_handler (newhandler);

   try

   {

      while (1)

      {

         new int[5000000];

         cout << "Allocating 5000000 ints." << endl;

      }

   }

   catch ( exception e )

   {

      cout << e.what() << " xxx" << endl;

   }

}

程序输出:

Allocating 5000000 ints.

       ……

Allocating 5000000 ints.

The new_handler is called:

bad allocation

 

 

 

一个设计得好的new-handler函数必须实现下面功能中的一种:

产生更多的可用内存:这将使operator new下一次分配内存的尝试有可能获得成功。实施这一策略的一个方法是:在程序启动时分配一个大的内存块,然后在第一次调用new-handler时释放。释放时伴随着一些对用户的警告信息,如内存数量太少,下次请求可能会失败,除非又有更多的可用空间。

安装另一个不同的new-handler函数:如果当前的new-handler函数不能产生更多的可用内存,可能它会知道另一个new-handler函数可以提供更多的资源。这样的话,当前的new-handler可以安装另一个new-handler来取代它(通过调用set_new_handler)。下一次operator new调用new-handler时,会使用最近安装的那个。(这一策略的另一个变通办法是让new-handler可以改变它自己的运行行为,那么下次调用时,它将做不同的事。方法是使new-handler可以修改那些影响它自身行为的静态或全局数据。

卸除new-handler:也就是传递空指针给set_new_handler。没有安装new-handler,operator new分配内存不成功时就会抛出一个标准的std::bad_alloc类型的异常。

抛出std::bad_alloc或从std::bad_alloc继承的其他类型的异常:这样的异常不会被operator new捕捉,所以它们会被送到最初进行内存请求的地方。(抛出别的不同类型的异常会违反operator new异常规范。规范中的缺省行为是调用abort,所以new-handler要抛出一个异常时,一定要确信它是从std::bad_alloc继承来的。

没有返回:典型做法是调用abort或exit。abort/exit可以在标准c库中找到

 

from http://www.cnblogs.com/xuliu/archive/2010/05/05/1728178.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值