zoukankan      html  css  js  c++  java
  • 【49】了解new_handler的行为

    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有关的代码上移到父类,具体的类继承类模版。 

  • 相关阅读:
    临床诊断与ICD10编码(3)肿瘤疾病编码
    临床诊断与ICD10编码(2)ICD10编码原则
    临床诊断与ICD10编码(1)前言
    webstrom中使用svn出现问题,无法连接url
    @RequestBody和@RequestParam的区别
    (转)使用Chrome://inspect调试 Android 设备上Webview
    (转)spring、spring boot、spring mvc之间的关系
    websotrom无法对使用了泛型的ts进行自动补全
    webpack里publicPath的配置
    博客网站
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3532826.html
Copyright © 2011-2022 走看看