网站建设的时候如何上传图片,wordpress如何发表新文章,wordpress批量跳转,上海最好的网站设计公司原文地址#xff1a;http://blog.csdn.net/wzq981264/article/details/673630 在过去或者传统的模式中#xff0c;当operator new不能满足一个内存分配请求的时候#xff0c;它会返回一个空指针#xff0c;但是现在如果operator new不能满足一个内存分配请求的时候#xf…原文地址http://blog.csdn.net/wzq981264/article/details/673630 在过去或者传统的模式中当operator new不能满足一个内存分配请求的时候它会返回一个空指针但是现在如果operator new不能满足一个内存分配请求的时候会抛出一个异常这个时候我们可不可以自己定制处理策略呢这正是new_handler的作用所在具体情况在后面详细道来。 当operator new申请一个内存失败时它会进行如下的处理步骤 1、如果存在客户指定的处理函数则调用处理函数new_handler如果不存在则抛出一个异常。new_handler的模型为void (*new_handler)()。 2、继续申请内存分配请求。 3、判断申请内存是否成功如果成功则返回内存指针如果失败转向处理步骤1。 可以用如下的代码表示全局部分 void (*class_new_oom_handler)();...... operator new执行方法中 void (*my_new_oom_handler)();
void *result;for( ; ; )
{my_new_oom_handler class_new_oom_handler;if( my_new_oom_handler NULL )THROW_BAD_NEW; //如果没有设置自定义处理函数则默认的处理方式为抛出一个异常
(*my_new_oom_handler)(); //调用自定义内存异常处理函数result malloc( n ); //继续申请内存if( result )return( result ); //申请成功返回指针
} 说了这么多大家一定会问那我怎么设置这个处理函数new_handler通过“void set_new_handler( void(*new_handler)()) throw();”进行设置它定义在new标准函数库中 namespace std
{void (*new_handler)();void set_new_handler( new_handler )throw();
} //error-handling function
void MemErrorHandling()
{std::cerr Failed to allocate memory.\n;std::abort();
}
... ...
std::set_new_handler(MemErrorHandling); 现在我们知道了new操作失败后系统地大概处理流程以及怎么设置用户自定义处理函数但是我们究竟可以在new_handler中做些什么处理呢 1、删除其它无用的内存使系统具有可以更多的内存可以使用为下一步的内存申请作准备。 2、设置另外一个new_handler。如果当前的new_handler不能够做到更多的内存申请操作或者它知道另外一个new_handler可以做到则可以调用set_new_handler函数设置另外一个new_handler这样在operator new下一次调用的时候可以使用这个新的new_handler。 3、卸载new_handler通过set_new_handler(0)使operator new在下一次调用的时候因为new_handler为空抛出内存申请异常。 4、抛出自定义异常。 5、不再返回调用abort或者exit退出程序。 参考 1、http://www.bc-cn.net/Article/kfyy/cjj/jszl/200604/4002.html