C++利用new_handler()函数处理异常
C++规定,new_handler要执行下述操作中的一种:
(1)使new有更多的内存使用,然后返回
(2)抛出一个bad_alloc异常或者其派生异常
(3)调用abort或者exit退出
下面举例说明,程序通过VS2008编译运行
#include <iostream>
#ifndef NUL
#define NUL '\0'
#endif
char* gPool = NULL;
void my_new_handler(void);//内存分配失败时调用这个函数
int main(void)
{
std::set_new_handler(my_new_handler);
try
{
gPool = new char[100*1<<20];
printf("alloc 100M memory for gPool! %#x\n",gPool);
}
catch ( ...)//用catch捕获异常
{
printf("gPool alloc memory failed!\n");
throw std::bad_alloc();
}
char* p = NULL;
for (int i = 0;i<20;++i)
{
p = new char [100*1<<20];
printf("alloc %dM memory for p!\n",(i+1)*100 );
}
printf("done...\n");
return NULL;
system("pause");
}
void my_new_handler(void)//用new_handler捕获异常并处理
{
if (gPool != NULL)
{
printf("try to get memory....\n");//帮助系统获得更多内存
delete [] gPool;
gPool = NULL;
return ;
}
else
{
printf("i can't help more...\n");
throw std::bad_alloc();
return ;
}
}