1. //############################################################################
  2. // 自定义new handler
  3. /*
  4. * 1. 什么是
  5. *
  6. * New handler 是当operator new分配内存失败是调用的函数
  7. * 目的是帮助内存分配成功
  8. * set_new_handler() 设置一个new handler并且返回当前的new handler.
  9. */
  10. void* operator new(std::size_t size) throw(std::bad_alloc) {
  11. while (true) {
  12. void* pMem = malloc(size); // 分配内存
  13. if (pMem)
  14. return pMem; // 成功则返回
  15. new_handler Handler = set_new_handler(0); // 获取new handler
  16. set_new_handler(Handler);
  17. if (Handler)
  18. (*Handler)(); // 调用new handler
  19. else
  20. throw bad_alloc(); // 如果new handler为空,抛异常
  21. }
  22. }
  23. /*
  24. * 所以new-handler 必须要做以下事情之一:
  25. * 1). 使更多的内存可用
  26. * 2). 设置一个不同的new-handler
  27. * 3). 卸载new-handler (即传一个null指针)
  28. * 4). 抛出一个bad_alloc异常或者派生类
  29. * 5). 终止程序
  30. */
  31. int main() {
  32. int *pGiant = new int[10000000000L];
  33. delete[] pGiant;
  34. }
  35. OUTPUT:
  36. terminate called after throwing an instance of 'std::bad_alloc'
  37. void NoMoreMem() {
  38. std::cerr << "Unable to allocate memory, Bo." << endl;
  39. abort();
  40. }
  41. int main() {
  42. std::set_new_handler(NoMoreMem);
  43. int *pGiant = new int[10000000000L];
  44. delete[] pGiant;
  45. }
  46. OUTPUT:
  47. Unable to allocate memory, Bo.
  48. /*
  49. * 2. 类专用的new-handler
  50. */
  51. class dog {
  52. int hair[10000000000L];
  53. std::new_handler origHandler;
  54. public:
  55. static void NoMemForDog() {
  56. std::cerr << "No more memory for doggy, Bo." << endl;
  57. std::set_new_handler(origHandler); // 抛异常之前把handler还原成老的
  58. throw std::bad_alloc;
  59. }
  60. void* operator new(std::size_t size) throw(std::bad_alloc) {
  61. origHandler = std::set_new_handler(NoMemForDog); //替换handler,保存老的handler
  62. void* pV = ::operator new(size); // 调用全局的operator new
  63. std::set_new_handler(origHandler); // 恢复老的handler
  64. return pV;
  65. }
  66. };
  67. int main() {
  68. std::tr1::shared_ptr<dog> pd(new dog());
  69. ...
  70. }

C++进阶--自定义new handler的更多相关文章

  1. Python 日志打印之自定义logger handler

    日志打印之自定义logger handler By:授客 QQ:1033553122 #实践环境 WIN 10 Python 3.6.5 #实践代码 handler.py #!/usr/bin/env ...

  2. 微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录

    在前面的Part3中, 我介绍Policy Injection模块中内置的Call Handler的使用方法,今天则继续介绍Call Handler——Custom Call Handler,通过建立 ...

  3. SpringMVC自定义兼容性Handler

    写在前面 看到这篇博客时,默认你知道Spring MVC中handler的作用,及前台请求到响应的的流转. 感谢网上其他大佬博客给我的借鉴,博客地址这里忘记了. 自定义Handler 我有时候会考虑是 ...

  4. python自定义logger handler

    _filefmt=os.path.join("logs","%Y-%m-%d.log") class MyLoggerHandler(logging.Handl ...

  5. .NetCore下使用Prometheus实现系统监控和警报 (五)进阶自定义收集指标 之 Counter

    Prometheus下面定了四种类型的收集方式,下面我们主要来来说下Counter的使用 Nuget导入Prometheus.AspNetCore包 下面先来看下我的Prometheus配置,这里我没 ...

  6. Android控件进阶-自定义流式布局和热门标签控件

    技术:Android+java   概述 在日常的app使用中,我们会在android 的app中看见 热门标签等自动换行的流式布局,今天,我们就来看看如何 自定义一个类似热门标签那样的流式布局吧,类 ...

  7. Android 进阶自定义 ViewGroup 自定义布局

    前言 在我们的实际应用中, 经常需要用到自定义控件,比如自定义圆形头像,自定义计步器等等.但有时我们不仅需要自定义控件,举个例子,FloatingActionButton 大家都很常用,所以大家也很经 ...

  8. Android开发进阶——自定义View的使用及其原理探索

    在Android开发中,系统提供给我们的UI控件是有限的,当我们需要使用一些特殊的控件的时候,只靠系统提供的控件,可能无法达到我们想要的效果,这时,就需要我们自定义一些控件,来完成我们想要的效果了.下 ...

  9. iOS开发进阶 - 自定义UICollectionViewLayout实现瀑布流布局

    移动端访问不佳,请访问我的个人博客 最近项目中需要用到瀑布流的效果,但是用UICollectionViewFlowLayout又达不到效果,自己动手写了一个瀑布流的layout,下面是我的心路路程 先 ...

随机推荐

  1. 内存池技术(UVa 122 Tree on the level)

    内存池技术就是创建一个内存池,内存池中保存着可以使用的内存,可以使用数组的形式实现,然后创建一个空闲列表,开始时将内存池中所有内存放入空闲列表中,表示空闲列表中所有内存都可以使用,当不需要某一内存时, ...

  2. mvc core2.1 Identity.EntityFramework Core 登录 (三)

    Controllers->AccountController.cs 新建 [HttpGet] [AllowAnonymous] public async Task<IActionResul ...

  3. hdu1796 How many integers can you find 容斥原理

    Now you get a number N, and a M-integers set, you should find out how many integers which are small ...

  4. 【git】git使用

    1.创建github账户 网站:https://github.com/ 注册省略 2.ssk-key客户端配置 作用:不用每次push,clone代码不需要输入用户名+密码 生成ssh-key ssh ...

  5. 【BZOJ1305】【CQOI2009】 dance跳舞

    看menci的博客点出二分的思路然后做出来,menci太强辣 原题: 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲. ...

  6. node学习笔记之io.sockets

    socket.get和socket.set函数已经失效,代码修改如下所示: 服务器端: var httpd = require('http').createServer(handler); var i ...

  7. Linux 修改yum源

    第一种方式: wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo 第二种方式: ...

  8. bash常识

    文章目录 比较是否相等 = 字符串操作 字符串变量的截取操作 字符串替换 字符串比较 取长度 查找子串的位置 选取子串 fork, exec, source fork exec source 补充 其 ...

  9. skipper http router 工具

    skipper 是一个http router && 反向代理服务组件,同时支持类似kubernetes 模型的ingress,由zalando 公司的团队开发 并开源,从功能上来看,可 ...

  10. 【VBA研究】VBA自己定义函数參数类型不符的错误

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/iamlaosong/article/details/36871769 作者:iamlaosong 1 ...