• 动态内存申请的结果——专题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不抛出异常

  • 相关阅读:
    Lintcode415-Valid Palindrome-Medium
    Lintcode455-StudentID-Easy
    Lintcode241-String to Integer
    Lintcode521-Remove Duplicate Numbers in Array-Easy
    Lintcode214-Max of Array-Naive
    面试一个小公司,TPM相关概念
    C#, introduction, general
    make命令和makefile
    OS_Architecture_MemoryHierarchy
    Leecode_98_Validate_Binary_Search_Tree
  • 原文地址:https://www.cnblogs.com/-glb/p/12302301.html
Copyright © 2020-2023  润新知