C++进阶--自定义new handler
//############################################################################
// 自定义new handler
/*
* 1. 什么是
*
* New handler 是当operator new分配内存失败是调用的函数
* 目的是帮助内存分配成功
* set_new_handler() 设置一个new handler并且返回当前的new handler.
*/
void* operator new(std::size_t size) throw(std::bad_alloc) {
while (true) {
void* pMem = malloc(size); // 分配内存
if (pMem)
return pMem; // 成功则返回
new_handler Handler = set_new_handler(0); // 获取new handler
set_new_handler(Handler);
if (Handler)
(*Handler)(); // 调用new handler
else
throw bad_alloc(); // 如果new handler为空,抛异常
}
}
/*
* 所以new-handler 必须要做以下事情之一:
* 1). 使更多的内存可用
* 2). 设置一个不同的new-handler
* 3). 卸载new-handler (即传一个null指针)
* 4). 抛出一个bad_alloc异常或者派生类
* 5). 终止程序
*/
int main() {
int *pGiant = new int[10000000000L];
delete[] pGiant;
}
OUTPUT:
terminate called after throwing an instance of 'std::bad_alloc'
void NoMoreMem() {
std::cerr << "Unable to allocate memory, Bo." << endl;
abort();
}
int main() {
std::set_new_handler(NoMoreMem);
int *pGiant = new int[10000000000L];
delete[] pGiant;
}
OUTPUT:
Unable to allocate memory, Bo.
/*
* 2. 类专用的new-handler
*/
class dog {
int hair[10000000000L];
std::new_handler origHandler;
public:
static void NoMemForDog() {
std::cerr << "No more memory for doggy, Bo." << endl;
std::set_new_handler(origHandler); // 抛异常之前把handler还原成老的
throw std::bad_alloc;
}
void* operator new(std::size_t size) throw(std::bad_alloc) {
origHandler = std::set_new_handler(NoMemForDog); //替换handler,保存老的handler
void* pV = ::operator new(size); // 调用全局的operator new
std::set_new_handler(origHandler); // 恢复老的handler
return pV;
}
};
int main() {
std::tr1::shared_ptr<dog> pd(new dog());
...
}
C++进阶--自定义new handler的更多相关文章
- Python 日志打印之自定义logger handler
日志打印之自定义logger handler By:授客 QQ:1033553122 #实践环境 WIN 10 Python 3.6.5 #实践代码 handler.py #!/usr/bin/env ...
- 微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录
在前面的Part3中, 我介绍Policy Injection模块中内置的Call Handler的使用方法,今天则继续介绍Call Handler——Custom Call Handler,通过建立 ...
- SpringMVC自定义兼容性Handler
写在前面 看到这篇博客时,默认你知道Spring MVC中handler的作用,及前台请求到响应的的流转. 感谢网上其他大佬博客给我的借鉴,博客地址这里忘记了. 自定义Handler 我有时候会考虑是 ...
- python自定义logger handler
_filefmt=os.path.join("logs","%Y-%m-%d.log") class MyLoggerHandler(logging.Handl ...
- .NetCore下使用Prometheus实现系统监控和警报 (五)进阶自定义收集指标 之 Counter
Prometheus下面定了四种类型的收集方式,下面我们主要来来说下Counter的使用 Nuget导入Prometheus.AspNetCore包 下面先来看下我的Prometheus配置,这里我没 ...
- Android控件进阶-自定义流式布局和热门标签控件
技术:Android+java 概述 在日常的app使用中,我们会在android 的app中看见 热门标签等自动换行的流式布局,今天,我们就来看看如何 自定义一个类似热门标签那样的流式布局吧,类 ...
- Android 进阶自定义 ViewGroup 自定义布局
前言 在我们的实际应用中, 经常需要用到自定义控件,比如自定义圆形头像,自定义计步器等等.但有时我们不仅需要自定义控件,举个例子,FloatingActionButton 大家都很常用,所以大家也很经 ...
- Android开发进阶——自定义View的使用及其原理探索
在Android开发中,系统提供给我们的UI控件是有限的,当我们需要使用一些特殊的控件的时候,只靠系统提供的控件,可能无法达到我们想要的效果,这时,就需要我们自定义一些控件,来完成我们想要的效果了.下 ...
- iOS开发进阶 - 自定义UICollectionViewLayout实现瀑布流布局
移动端访问不佳,请访问我的个人博客 最近项目中需要用到瀑布流的效果,但是用UICollectionViewFlowLayout又达不到效果,自己动手写了一个瀑布流的layout,下面是我的心路路程 先 ...
随机推荐
- qt 内置图标使用
QToolButton *button = new QToolButton(this); button->resize(100,30); button->setToolButtonStyl ...
- ps使用图层合并切图
1.新建图层 2.合并要切的图的图层和新建的空白图层 3用正方形工具圈出来要切得图 4.ctrl+c复制,ctrl+n新建,ctrl+v复制过去 5,切图
- 自定义bootbox:dialog方法
<script src="static/ace/js/bootbox.js"></script>bootbox.dialog({ message: '< ...
- Mysql的两种引擎
Innodb引擎: 1.Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别 2.该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于 ...
- $.each $.map $.filter 区别 Script
$('section.required').each(function () { var type = $(this).attr('data-type'); if (type == 'MULTIPLE ...
- IDEA在jsp页面写out.print()代码报错
如题,小编以前用myeclipse,eclipse的时候,在jsp里写java代码都是可以的,现在我换成了IDEA,却莫名报错 而且没有代码提示,比如说下图这样的,,虽然运行还是能运行...但对强迫症 ...
- css易错点总结
传智老师说:找工作要问调不调IE6,同样的工作待遇,如果不用调IE6开12000工资,要调IE6,直接加价到15000,因为调IE6能累死人,气死人. 行高要在字体后面,如下: 正确:font:400 ...
- bfprt
bfprt //找第k小的数 #include <iostream> #include <vector> #include <algorithm> using na ...
- lua C++ wrapper
背景 最近在研究lua的c++绑定库,使用过一下几个 luabind 问题:没人维护 https://github.com/vinniefalco/LuaBridge https://github.c ...
- mysql之 误用SECONDS_BEHIND_MASTER衡量MYSQL主备的延迟时间
链接:http://www.woqutech.com/?p=1116 MySQL 本身通过 show slave status 提供了 Seconds_Behind_Master ,用于衡量主备之间的 ...