内存溢出处理

[ 1042 查看 / 0 回复 ]

使用new可以动态分配内存,但是当内存不足以分配或者内存溢出时,new会如何处理呢?
如果new运算符不能分配所需的内存,它会激活一个函数指针,该函数一般会输出一条错误消息并退出程序(exit),或是释放某些内存然后返回,一旦返回,new会再次尝试分配所需要的内存,这种情况会持续下去,直到有可分配的内存或者退出程序。如果待激活的函数指针为空(默认情况),也就是当内存耗尽而new不能分配时没有要调用的函数,这种情况与编译器的版本有关,一般new会终止程序。要设定上述这个函数指针要使用函数set_new_handlervc++下用_set_new_handler ,这个函数包含在new库中,原型是: typedef void *new_handler();
new_handler set_new_handler(new_hanlder) throw();
输入是新的函数指针,输出是旧有的函数指针,而且函数指针所指函数必须不带参数也不带返回值。故下面程序的就很好理解了:
#include <new>
void (*my_own)(){/*code*/}//这是我自己的内存溢出处理函数
int main(){
void (*previous_handler)();//用来存储旧有的函数指针
previous_handler=set_new_handler(my_own);//设置内存溢出处理函数为my_own
previous_handler=set_new_handler(previous_handler);
//设置内存溢出处理函数为原来的函数,但现在的previous_handler存储的函数指针是my_own
previous_handler=set_new_handler(previous_handler);//重新设置内存处理函数为my_own
}
例:
#include <iostream>
#include <new>
#include <string>
#include <exception>

int main(){
    void (*my_new_handler){
        throw "There is no memory to use.";
    }
    set_new_handler(my_new_handler);
    try {
      while(true){
        new int[50000];
      }
    }catch(const char *str){
        cout<<str;
    }
}
TOP
凌阳教育嵌入式培训