1、使用operator new无法获取内存时,对于旧式编译器,会返回一个null指针。对于新式编译器,会抛出一个异常。

2、考虑下面的需求,当operator new 无法获取内存时,程序员期望获得通知,并调用一个方法。也就是说,向系统传递一个回调方法。这就是new_handler:

  typedef void (* new_handler) (void); new_handler是一个指针方法,形参为空,没有返回值。

  new_handler set_new_handler(new_handler p) throw ();

  set_new_handler 方法就是传递一个回调方法,返回老的回调方法。

3、new_handler 的意思就是说,当使用operator new 无法分配内存时,转交给用户,用户来做一些事情。new_handler 要做下列事情:

  a、提供更多内存可供使用;

  b、安装另一个new_handler,调用另一个方法;

  c、卸载new_handler,这时会抛出异常;

  d、抛出bad_alloc异常;

  e、不返回,调用abort或者exit。

4、C++并不支持class专属的new_handler。也就是说,程序员期望,对于不同的class,在堆上分配对象无法获取内存时,可以做不同的事情,但是C++不支持class专属的new_hanlder,也就是说,所有的operator new 共享new_handler,那该怎么办?

  想法是:分配Widget对象之前,安装Widget的new_handler,分配成功后,卸载Widget的new_handler。

5、为了保证能够卸载成功,需要使用资源管理类,对老的new_handler管理,析构的时候,重新指向老的new_handler。

6、为了可以支持不同class,建立一个模板类,并且把set_new_handler有关的代码上移到父类,具体的类继承类模版。 

最新文章

  1. like语句百分号前置会使用到索引吗?
  2. ComponetArt Upload上传组件
  3. Bulk_Collect_Performance 比较
  4. Android TelephonyManager电话管理器
  5. Cocos2d-x 3.2 学习笔记(十)Joystick 搖杆控件
  6. 单元测试中如何配置log4net
  7. Opencv混合高斯模型前景分离
  8. vba 工作案例1
  9. 继续Wcf记录点滴
  10. C语言 数组做函数参数退化为指针的技术推演
  11. 使用Nginx解决IIS绑定域名导致应用程序重启的问题
  12. 【转载】茶叶蛋干货!《超容易的Linux系统管理入门书》(连载十)进行动态主机配置DHCP
  13. 从头学起android<AutoCompleteTextView文章提示文本框.十九.>
  14. web.xml文件中的7个错误的安全配置
  15. (1)pygame_第一个窗口程序
  16. git stash的用法
  17. TortoiseGit 安装
  18. Entity Framework入门教程(17)---记录和拦截数据库命令
  19. 【原创】大叔问题定位分享(11)Spark中对大表子查询加limit为什么会报Broadcast超时错误
  20. P2685 [TJOI2012]桥

热门文章

  1. 深入理解Android内存管理原理(六)
  2. 真机无法接收到android.provider.Telephony.SMS_RECEIVED的问题
  3. 常用的js代码
  4. Ejabberd源码解析前奏--安全
  5. jquery 图片上传本地预览V1.2
  6. MVC 5 的 EF6 Code First 入门
  7. 提示35. 怎样实现OfTypeOnly<TEntity>()这样的写法
  8. java产生随机数的几种方式(转)
  9. DB面试题
  10. (转载)HTML与XHTML有什么区别