zoukankan      html  css  js  c++  java
  • 动态内存申请的结果——专题1

    动态内存申请一定成功吗?
    常见的动态内存分配代码

    C代码:

    int* p = (int*)malloc(10 * sizeof(int));
    if( p!=NULL )
    {
        //... ...
    }

    C++代码:

    int* p = new int[10];
    if( p!=NULL )
    {
        //... ...
    }

    必须知道的事实
    malloc函数申请失败时返回NULL值
    new关键字申请失败时(根据编译器的不同)
      返回NULL值(以前的编译器)
      抛出std::bad_alloc异常(现代的编译器)

    因此,上面的C++代码中的那种写法就不合理了。

    问题:
    new语句中的异常是怎么抛出来的?
    new关键字在C++规范中的标准行为
    -在堆空间申请足够大的内存
    成功:
      在获取的空间中调用构造函数创建对象
      返回对象的地址

    失败:
      抛出std::bad_alloc异常

    new关键字在C++规范中的标准行为:
    -new在分配内存时
      如果空间不足,会调用全局的new_handler()函数
      new_handler()函数中抛出std::bad_alloc异常
    -可以自定义new_handler()函数
      处理默认的new内存分配失败的情况

    new_handler()的定义和使用

    void my_new_handler()
    {
        cout << "No enough memory" <<endl;
        exit(1);
    }
    
    int main()
    {
        set_new_handler(my_new_handler);
        
        //... ...
        
        return 0;
    }

    问题:
    如何跨编译器统一new的行为,提高代码移植性?

    解决方案:
    -全局范围(不推荐)
      重新定义new/delete的实现,不抛出任何异常
      自定义new_handler()函数,不抛出任何异常
    —类层次范围(比较安全)
      重载new/delete,不抛出任何异常
    -单次动态内存分配
      使用nothrow参数,指明new不抛出异常

  • 相关阅读:
    nginx 特定目录禁止php执行
    linux awk命令详解
    漫谈大型网站架构
    ThinkPHP 自动验证实例
    使用jquery时一些小技巧的总结
    fputcsv 导出CSV、Excel DownLoad
    文件操作总结
    rc.local 开机自启脚本无法启动
    Windows pycharm Terminal使用Anaconda 的Prompt
    解决hash冲突方法
  • 原文地址:https://www.cnblogs.com/-glb/p/12302301.html
Copyright © 2011-2022 走看看