C++利用new_handler()函数处理异常

来源:互联网 发布:源代码java教学视频 编辑:程序博客网 时间:2024/06/01 10:21

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 ;
    }
}

在32位windows系统中,允许用户申请的内存为2G,其余的给内核使用。而在32位linux系统中允许用户申请的内存为3G,剩下的给内核使用。上面程序在windows下最终会耗尽内存,抛出异常,被my_new_handler函数捕获。