• 早期malloc分配时,如果内存耗尽分配不出来,会直接返回NULL。现在分配不出来,直接抛出异常(可使用nothrow关键字)


    今天和同事review代码时,发现这样的一段代码:

    Manager * pManager = new Manager();

    if(NULL == pManager)

    {

        //记录日志

        return false;

    }

    然后,一个同事就说这样写欠妥,应该改为:

    Manager * pManager = NULL;

    try

    {

        pManager = new Manager();

    }

    catch(std::bad_alloc e)

    {

        //...

    }

    我查了一下资料,发现:

    1.malloc分配时,如果内存耗尽分配不出来,会直接返回NULL;

    2.早期C++版本,new分配时,如果内存耗尽分配不出来,也会直接返回NULL;

    3.现代编译器,如gcc和VC,则都在分配不出内存时,抛出异常;

    4.但是,在面对不支持异常的嵌入式环境,或者编程人员不喜欢使用异常结构时,则也有办法解决,即关键字nothrow,如以下代码:

    #include <new>//必须使用new头文件

    Manager * pManager = new (std::nothrow) Manager();

    if(NULL == pManager)

    {

        //记录日志

        return false;

    }

    ================================================

    5.如果您不想使用关键字nothrow,该如何解决这个问题呢?也可以解决,即替换new_handler即可。

    想知道为何替换new_handler就能解决这个问题,需要理解new分配时,内存耗尽是如何抛出异常的。每当new分配内存,而没有足够的内存可供分配时,它会调用new_handler函数,而缺省的new_handler函数,会抛出throw bad_alloc()。为了避免抛出这个异常,可以替换一个不抛出异常的new_handler即可。

    typedef void (*new_handler)();
    new_handler set_new_handler(new_handler p) throw();

    new_handler是一个自定义的函数指针类型,它指向一个没有输入参数也没有返回值的函数。
    set_new_handler是一个输入并返回new_handler类型的函数。
    set_new_handler的输入参数是operator new分配内存失败时要调用的出错处理函数的指针,返回值是set_new_handler没调用之前就已经在起作用的旧的出错处理函数的指针。

    如以下代码:

    #include <new>
    #include <iostream>
    #include <stdlib.h>

    using namespace std;

    void __cdecl newhandler()
    {
        return;
    }

    int main()
    {
        set_new_handler (newhandler);

        Manager * pManager = new (std::nothrow) Manager();
        if(NULL == pManager)
        {
            //记录日志
            return false;
        }
    }

    http://blog.csdn.net/huyiyang2010/article/details/5984987

  • 相关阅读:
    iOS6和iOS7代码的适配(5)——popOver
    es5创建对象与继承
    js学习日记-new Object和Object.create到底干了啥
    js滚动及可视区域的相关的操作
    css匹配规则及性能
    normalize.css源码分析
    css的水平居中和垂直居中总结
    js快速排序算法
    数据结构flash演示
    二叉树遍历
  • 原文地址:https://www.cnblogs.com/findumars/p/7378725.html
Copyright © 2020-2023  润新知